gpt4 book ai didi

python - .after() 应用于什么有关系吗?

转载 作者:行者123 更新时间:2023-12-01 05:06:28 27 4
gpt4 key购买 nike

我想了解如何最好地使用 after() ,即与什么绑定(bind)。为了测试几种场景,我编写了三个简单的计数器来显示经过的秒数:

  • clock1 :框架中的标签(它本身是根窗口的子窗口),绑定(bind)到框架
  • clock2 : 与上面相同的 Frame 中的 Label,绑定(bind)到 root
  • clock3 : root 中的一个 Label,绑定(bind)到 root

实际代码:

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)会起作用,因此将其绑定(bind)到根窗口只是一个约定?

最佳答案

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
>>>

这是因为 afterbasic widget method 所有 Tkinter 小部件都可用。因此,您可以随意调用它,并且始终获得相同的效果。

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

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

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

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

关于python - .after() 应用于什么有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24915970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com