You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:06:03