如何擦除帧的内容

时间:2014-07-14 13:19:23

标签: python tkinter

我有Frame,其中包含多个Label。所有Label中的文字都会定期重新计算,我希望之前删除Frame中的所有内容。

最初我认为替换Label

的文本就足够了
import Tkinter as tk

class MyApp():
    def __init__(self):
        self.counter = 0
        self.root = tk.Tk()
        self.frame = tk.Frame(self.root)
        self.frame.grid(row=0, column=0)  # typo edited following the answer
        self.root.bind('q', self.toggle)


    def toggle(self, event):
        self.counter += 1
        if self.counter % 2 == 0:
            text = "hello {}".format(self.counter)
            bg = "green"
        else:
            text = "very long text, longer than hello {}".format(self.counter)
            bg = "blue"
        # the tk.Label call is not assigned to a variable on purpose
        tk.Label(self.frame, text=text, bg=bg).grid(row=0, column=0)

app = MyApp()
app.root.mainloop()

但是文本没有被替换,但是文本保留的时间越长:

enter image description here

如何在不删除每个元素的情况下擦除帧的内容?

请注意tk.Label来电没有分配变量,我有几个Label,一旦显示,就不需要跟踪它们。我想,我可以保留所有Label.grid_forget()的列表,但如果有更简单的解决方案,它会带来更清晰的代码。

1 个答案:

答案 0 :(得分:0)

由于您始终使用相同的标签,因此可以使用__init__方法创建它,然后在回调中对其进行配置:

def __init__(self):
    # ...
    self.frame = tk.Frame(self.root).grid(row=0, column=0)
    self.label = tk.Label(self.frame)
    self.label.grid()
    self.root.bind('q', self.toggle)


def toggle(self, event):
    self.counter += 1
    # ...
    # the tk.Label call is not assigned to a variable on purpose
    self.label.config(text=text, bg=bg)

更新:由于您不想对标签使用任何变量,因此您可以销毁该框架的所有子项:

def toggle(self, event):
    # ...
    for children in self.frame.winfo_children():
        children.destroy()
    tk.Label(self.frame, text=text, bg=bg).grid(row=0, column=0)

请注意,对grid()的调用会返回None,因此在原始示例中,变量self.frame不包含小部件引用:

def __init__(self):
    self.counter = 0
    self.root = tk.Tk()
    self.frame = tk.Frame(self.root)
    # WRONG
    # self.frame = tk.Frame(self.root).grid(row=0, column=0)
    # RIGHT
    self.frame.grid() # row=0, column=0 comes by default