0

我想在窗口的主循环旁边运行一个函数。我有这个代码:

from tkinter import *

window = Tk()

def task():
    print("hello")
    window.after(1000, task)

window.after(1000, task)
window.mainloop()

此代码每秒打印一次“hello”。如果我像这样向函数添加参数task

from tkinter import *

window = Tk()

def task(arg):
    print("hello")
    window.after(1000, task(0))

window.after(1000, task(0))
window.mainloop()

在显示此错误消息之前,该函数会立即执行:

RecursionError: maximum recursion depth exceeded while calling a Python object

是否不能在方法中使用带有参数的回调函数after

奇怪的是,官方 API 站点上似乎没有关于此方法的文档。

4

1 回答 1

2

发生这种情况是因为 task(0) 实际上是在调用自身,而不是像在第一个代码中那样传递要调用的函数的名称,而是传递一个表达式,该表达式以 0 作为参数调用函数任务,并且当这种情况发生时,函数会调用自身一次又一次,因为在函数调用内部,您使用相同的表达式再次调用它,这种情况会发生,直到递归调用的 python 达到最大深度(我认为它是 1000)。

如果你想传递一个参数,一个解决方案是使用这样的 lambda 表达式:

window.after(1000, lambda:task(0))
于 2022-01-10T11:55:30.880 回答