我有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()
但是文本没有被替换,但是文本保留的时间越长:
如何在不删除每个元素的情况下擦除帧的内容?
请注意tk.Label
来电没有分配变量,我有几个Label
,一旦显示,就不需要跟踪它们。我想,我可以保留所有Label
和.grid_forget()
的列表,但如果有更简单的解决方案,它会带来更清晰的代码。
答案 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