我正在使用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()
运行正常并按照我的要求执行操作,在备份运行时弹出窗口,然后在备份后窗口关闭。但是,如果我从widget中传递和参数,就像下面的代码一样,“请稍候”消息永远不会出现。
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()
答案 0 :(得分:18)
执行此操作时:
widget.after(10, self.runBackup(mybackup))
...你告诉Tkinter“运行命令runBackup
,当它返回时,使用结果作为after
的参数”。由于runBackup
返回None
,因此上述内容相当于:
self.runBackup(mybackup)
widget.after(10, None)
相反,您希望为该函数提供after
引用,而不是调用该函数。如果命令需要参数,则可以将这些参数作为附加参数提供给after
。
例如:
widget.after(10, self.runBackup, mybackup)
答案 1 :(得分:1)
我会尝试functools.partial来打包你的电话:
widget.after(10, functools.partial(self.runBackup, mybackup))
或者您可以定义一个不带参数但传递参数的本地函数(实际上是functools.partial所做的)。
答案 2 :(得分:0)
添加:使用Lambda函数格式,该函数在多次递归调用后不会失败。 例如:
Function abc(par):
stat-1
stat-2
...
stat-n
root.after(1000, lambda : abc(par))
...
(例如,更新窗口左上角的时钟非常有用...)