我想了解如何最好地使用after()
,即用什么绑定它。为了测试几个场景,我编写了三个简单的计数器来显示经过的秒数:
clock1
:框架中的标签(它本身是根窗口的子窗口),绑定到框架clock2
:与上面相同框架中的标签,绑定到根clock3
:根中的标签,绑定到根实际代码:
import Tkinter as tk
class App():
def __init__(self):
self.counter1 = 0
self.counter2 = 100
self.counter3 = 1000
self.root = tk.Tk()
self.frame = tk.Frame(self.root)
self.frame.pack()
self.label1 = tk.Label(self.frame, text="clock1")
self.label1.pack()
self.label2 = tk.Label(self.frame, text="clock2")
self.label2.pack()
self.label3 = tk.Label(self.root, text="clock3")
self.label3.pack()
def clock1(self):
self.counter1 += 1
text = "hello from clock1: {}".format(self.counter1)
self.label1.configure(text=text)
self.frame.after(1000, self.clock1)
def clock2(self):
self.counter2 += 1
text = "hello from clock2: {}".format(self.counter2)
self.label2.configure(text=text)
self.root.after(1000, self.clock2)
def clock3(self):
self.counter3 += 1
text = "hello from clock3: {}".format(self.counter3)
self.label3.configure(text=text)
self.root.after(1000, self.clock3)
a = App()
a.clock1()
a.clock2()
a.clock3()
a.root.mainloop()
此代码在运行时在18秒后显示:
这意味着所有计数器都已更新。在这种情况下,.after()
应用于什么有关系吗?(如果这不是正确的表达,请道歉)
换句话说<whatever object exists>.after(time, my_callback)
将工作,因此将其绑定到根窗口只是一种约定?你知道吗
Tkinter.Tk
、Tkinter.Label
、Tkinter.Frame
等的after
方法都是相同的:这是因为
after
是在allTkinter小部件上可用的basic widget method。所以,你可以随意调用它,总是得到同样的效果。你知道吗也就是说,我认为最好只对根窗口对象(主
Tkinter.Tk
实例)调用after
方法,因为:正如你在帖子中所说,这是一种非常普遍的做法。如果你打破这个伪惯例,可能会让人困惑。
通常,在显式关闭应用程序之前,根窗口对象不会消失。换句话说,它将永远存在。如果使用子小部件的
after
方法(如标签),则如果小部件对象被销毁,代码可能会中断并引发AttributeError
。如果您的应用程序具有动态小部件和/或在满足特定条件后消失的小部件,则可能会发生这种情况。这只是我的观点,但是主窗口对象负责执行回调和管理事件似乎是正确的。毕竟,它代表了应用程序本身。然而,一个标签应该是:一个标签。它不应该与管理应用程序有关。
相关问题 更多 >
编程相关推荐