Python Tkinter使用grid_forget()无法隐藏Label控件问题求助
问题排查
- 你在
NewSoftware、UpdateSoftware类中创建的Label是类内部的局部变量,print_selection函数无法访问到这两个Label实例,调用grid_forget()自然不生效。 - 全局作用域的
lab1是TAB1的标题标签,和类内部的lab1重名,逻辑完全冲突。 - 每次切换单选按钮都会重新创建类实例,会导致相同位置重复生成Label控件,越堆越多。
修正后代码
import os import tkinter as tk from tkinter import ttk from tkinter import * class NewSoftware: def __init__(self,master): self.master = master # 将Label设为实例属性,外部可以访问 self.lab = ttk.Label(master, text = "Hello", font = ("Calibri" ,10)) self.lab.grid(column = 1, row = 2) def combo_input(self): print ("do something") class UpdateSoftware: def __init__(self,master): self.master = master # 将Label设为实例属性,外部可以访问 self.lab = ttk.Label(master, text = "Bye", font = ("Calibri" ,10)) self.lab.grid(column = 2, row = 2) def combo_input(self): print ("do something") #Show / hide def print_selection(): if var.get() == 1: print ("add new software") # 隐藏更新的Label,显示新增的Label update_soft.lab.grid_remove() new_soft.lab.grid() elif var.get() == 2: print ("update software") # 隐藏新增的Label,显示更新的Label new_soft.lab.grid_remove() update_soft.lab.grid() #--- GUI --- root = tk.Tk() root.geometry('490x410') root.title("Software") var = tk.IntVar() TAB_CONTROL = ttk.Notebook(root) #--- TAB 1 --- TAB1 = ttk.Frame(TAB_CONTROL) TAB_CONTROL.add(TAB1, text = 'Add/Update Software') frame1 = Frame(TAB1) frame1.pack(fill='both') # 这是TAB1的标题Label,单独命名避免重名冲突 title_lab1 = Label(frame1, text = "Add/Update Software", font = ("Calibri" ,10)) title_lab1.grid(column = 1, row = 0) c1 = Radiobutton(frame1, text='Add New Software',variable=var, value=1, command = print_selection) c1.grid(column =1, row = 1, sticky = 'W') c2 = tk.Radiobutton(frame1, text='Update Software',variable=var, value=2, command = print_selection) c2.grid(column =2, row = 1, sticky = 'W') # 提前创建两个功能类实例,默认隐藏Label避免初始状态显示异常 new_soft = NewSoftware(frame1) update_soft = UpdateSoftware(frame1) new_soft.lab.grid_remove() update_soft.lab.grid_remove() #--- TAB 2 --- TAB2 = ttk.Frame(TAB_CONTROL) TAB_CONTROL.add(TAB2, text = 'Past Version Checker') TAB_CONTROL.pack(expand = 0, fill = "both") frame2 = Frame(TAB2) frame2.pack(fill='both') lab1 = Label(frame2, text = "Past Version Checker", font = ("Calibri" ,11 ,"bold")) lab1.grid(column = 1, row = 0) root.mainloop()
修正说明
- 将两个功能类中的Label改为实例属性,外部函数可以直接访问控制
- 提前初始化两个类实例,避免切换时重复创建控件
- 单独修改TAB1标题的变量名,避免重名冲突
- 切换时直接调用
grid_remove()隐藏对应Label,grid()显示目标Label,双向切换正常生效
内容的提问来源于stack exchange,提问作者nellie456
相关产品推荐
相关产品推荐

