无法在tkinter中销毁小部件。

时间:2016-12-12 09:48:09

标签: python python-3.x tkinter

我想在点击一个支票按钮时创建一些小部件。然后我需要它们隐藏并重新出现在切换按钮上。我能够创建小部件,但无法销毁它们。我尝试过grid_remove()grid_forget()destroy()。旨在隐藏或销毁它们的声明似乎正在执行,但小部件仍然存在。没有报告错误。

以下是一些重现问题的代码:

from tkinter import *
from tkinter.ttk import *

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Checkbutton")
        self.pack(fill=BOTH, expand=True)
        self.var = BooleanVar()
        cb = Checkbutton(self, text="Show title",
            variable=self.var, command=self.onClick)
        cb.grid(row=2, column=2)

    def onClick(self):
        widget = Label(self, text="Enter text")
        if self.var.get():
             self.master.title("Checkbutton")
             widget.grid(row=3, column=2, padx=10, pady=10)
        else:
             self.master.title("")
             widget.destroy()   

root = Tk()
app = Example(root)
root.mainloop()

1 个答案:

答案 0 :(得分:2)

在您的代码中,每次点击CheckButton时,onClick都会创建新的 Label小部件。而你的if-else条件会破坏之前创建的新小部件,而不是小部件。您应该通过self.widget = Label链接您的小部件。现在函数将删除在过去的函数调用中创建的元素。

您的代码将是:

from tkinter import *
from tkinter.ttk import *

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Checkbutton")
        self.pack(fill=BOTH, expand=True)
        self.var = BooleanVar()
        cb = Checkbutton(self, text="Show title",
            variable=self.var, command=self.onClick)
        cb.grid(row=2, column=2)

    def onClick(self):
        if self.var.get():
             self.widget = Label(self, text="Enter text")
             self.master.title("Checkbutton")
             self.widget.grid(row=3, column=2, padx=10, pady=10)
        else:
             self.master.title("")
             self.widget.destroy()   

root = Tk()
app = Example(root)
root.mainloop()