如何将带参数的函数传递给 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))
我想 运行 在 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))