Python 无法从tkinter 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

我正在使用tkinter构建的GUI的一部分有一个弹出窗口,上面写着“程序正在运行,请稍候。”然后在它完成后,窗口就会消失。我正在使用widget.after命令打开窗口并运行该命令。但是,如果我传递调用参数的函数,那么弹出窗口将永远不会出现。下面是一个例子:

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))

    ...