为了及时更新小部件,我使用 .after()
方法,通常采用以下形式:
def update():
do_something()
<widget>.after(<delay>, update)
据我了解,小部件会等待一定时间,然后执行 update()
函数,最后小部件会再次等待,然后重新执行该函数,等等。
在我看来,这很像递归。所以,问题是:.after()
是否真的通过递归工作?
如果是,那么递归的深度是有限制的,但是下面的例子应该证明永远不会达到这样的限制:
from tkinter import *
counter = 0
def count():
global counter
counter += 1
lbl.config(text=counter)
root.after(10, count)
root = Tk()
lbl = Label(root, text='0')
lbl.pack()
Button(root, text='Start count', command=count).pack()
root.mainloop()
在我的系统中,递归深度的限制是 1000,但是这个例子在几秒钟内就远远超过了这个值,直到我停止它。
最佳答案
递归意味着函数的当前实例被搁置,并创建并运行一个新实例。 after
的工作方式不同,不是递归。
您可以将主循环视为维护待办事项列表的无限循环。该列表具有函数和它们应该运行的时间。 mainloop 不断检查待办事项列表,如果待办事项列表中的某个项目要运行,则 mainloop 从列表中删除该项目并运行它。完成后,它会返回循环并检查列表。 after
方法只是向这个待办事项列表添加一个函数以及运行它的时间。
关于python - Tkinter 的 .after() 和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44710233/