Skip to main content
 首页 » 编程设计

python之Tkinter 的 .after() 和递归

2025年05月04日13luoye11

为了及时更新小部件,我使用 .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 方法只是向这个待办事项列表添加一个函数以及运行它的时间。