如何将带参数的函数传递给 tk 的 after 方法?

how to pass a function with parameters to after method of tk?

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

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 方法中使用带参数的回调函数?

奇怪的是,official API site.

上似乎没有关于此方法的文档

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

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

window.after(1000, lambda:task(0))