python - Tkinter 的 .after() 和递归

标签 python python-3.x recursion tkinter

为了及时更新小部件,我使用 .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/

相关文章:

python - 我得到一个无,每一行

python - 对 python 文档中的公式范围感到困惑

java - 递归 - boolean 和大信号

java堆栈溢出错误?

c - 8 回溯难题

python - 在 Pandas 中查找时间序列数据中某个值出现的最后一个序列

python - MS Access 关系问题

python - 如何在 MinMaxScaler 中对矩阵中的列使用 inverse_transform

python - 提前设置部分lambda函数以避免重复代码

python - 正则表达式组 : How to get the desired output with a more specific match pattern?