对什么应用.after()重要吗?

2024-05-21 04:34:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想了解如何最好地使用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秒后显示:

enter image description here

这意味着所有计数器都已更新。在这种情况下,.after()应用于什么有关系吗?(如果这不是正确的表达,请道歉)

换句话说<whatever object exists>.after(time, my_callback)将工作,因此将其绑定到根窗口只是一种约定?你知道吗


Tags: textself框架defroot标签framepack
1条回答
网友
1楼 · 发布于 2024-05-21 04:34:09

Tkinter.TkTkinter.LabelTkinter.Frame等的after方法都是相同的:

>>> import Tkinter
>>> Tkinter.Tk.after is Tkinter.Frame.after
True
>>> Tkinter.Label.after is Tkinter.Tk.after
True
>>> Tkinter.Frame.after is Tkinter.Label.after
True
>>>

这是因为after是在allTkinter小部件上可用的basic widget method。所以,你可以随意调用它,总是得到同样的效果。你知道吗

也就是说,我认为最好只对根窗口对象(主Tkinter.Tk实例)调用after方法,因为:

  1. 正如你在帖子中所说,这是一种非常普遍的做法。如果你打破这个伪惯例,可能会让人困惑。

  2. 通常,在显式关闭应用程序之前,根窗口对象不会消失。换句话说,它将永远存在。如果使用子小部件的after方法(如标签),则如果小部件对象被销毁,代码可能会中断并引发AttributeError。如果您的应用程序具有动态小部件和/或在满足特定条件后消失的小部件,则可能会发生这种情况。

  3. 这只是我的观点,但是主窗口对象负责执行回调和管理事件似乎是正确的。毕竟,它代表了应用程序本身。然而,一个标签应该是:一个标签。它不应该与管理应用程序有关。

相关问题 更多 >