Python 无法从tkinter widget.after函数传递参数
我正在使用tkinter构建的GUI的一部分有一个弹出窗口,上面写着“程序正在运行,请稍候。”然后在它完成后,窗口就会消失。我正在使用widget.after命令打开窗口并运行该命令。但是,如果我传递调用参数的函数,那么弹出窗口将永远不会出现。下面是一个例子:Python 无法从tkinter widget.after函数传递参数,python,popup,window,tkinter,arguments,Python,Popup,Window,Tkinter,Arguments,我正在使用tkinter构建的GUI的一部分有一个弹出窗口,上面写着“程序正在运行,请稍候。”然后在它完成后,窗口就会消失。我正在使用widget.after命令打开窗口并运行该命令。但是,如果我传递调用参数的函数,那么弹出窗口将永远不会出现。下面是一个例子: def backupWindow self.restoreCB = Toplevel() message = "Please wait while backup runs" Label(self.restoreC
def backupWindow
self.restoreCB = Toplevel()
message = "Please wait while backup runs"
Label(self.restoreCB, text=message, padx=100, pady=20).pack()
widget.after(10, self.runBackup)
def runBackup(self):
<backup code>
self.backupCB.destroy()
def backupWindow
self.restoreCB=Toplevel()
message=“正在运行备份,请稍候”
标签(self.restoreCB,text=message,padx=100,pady=20).pack()
widget.after(10,self.runBackup)
def运行备份(自我):
self.backupCB.destroy()
这运行正常,并符合我的要求,在备份运行时弹出窗口,然后在备份后关闭窗口。但是,如果我从widget.com传递and参数,就像下面的代码一样,“请等待”消息永远不会出现
def backupWindow
self.restoreCB = Toplevel()
message = "Please wait while backup runs"
Label(self.restoreCB, text=message, padx=100, pady=20).pack()
widget.after(10, self.runBackup(mybackup))
def runBackup(self,mybackup):
<backup code using mybackup>
self.backupCB.destroy()
def backupWindow
self.restoreCB=Toplevel()
message=“正在运行备份,请稍候”
标签(self.restoreCB,text=message,padx=100,pady=20).pack()
widget.after(10,self.runBackup(mybackup))
def runBackup(self,mybackup):
self.backupCB.destroy()
我会尝试使用functools.partial将您的通话包装为:
widget.after(10, functools.partial(self.runBackup, mybackup))
或者,您可以定义一个本地函数,该函数不接受任何参数,但传递参数(本质上就是functools.partial所做的)。执行此操作时:
widget.after(10, self.runBackup(mybackup))
。。。您告诉Tkinter“运行命令runBackup
,当它返回时,将结果用作后面的参数”。由于runBackup
返回None
,因此上述内容相当于:
self.runBackup(mybackup)
widget.after(10, None)
相反,您希望在
之后提供对函数的引用,而不是调用函数。如果命令需要参数,可以将这些参数作为附加参数提供给之后的
例如:
widget.after(10, self.runBackup, mybackup)
添加:使用Lambda函数格式,函数在多次递归调用后不会失败。
例如:
(例如,更新窗口左上方的时钟非常有用…虽然这是一个完全可以接受的解决方案,但它比需要的更复杂after
设计用于获取参数,并在调用函数时使用参数,OP只是做错了。在这个简单的例子中,您可以使用lambda
来定义匿名函数,而不是functools。部分:小部件。after(10,lambda:self.runBackup(mybackup))
只是为了完整性,结果调用是小部件。after(10,None)
因为没有return语句的函数返回None
。您的意思是.after(1000,lambda:abc(par))
比after(1000,abc,par)
更适合递归调用吗?真正的问题。
Function abc(par):
stat-1
stat-2
...
stat-n
root.after(1000, lambda : abc(par))
...