9

我正在使用 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.after 传递 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()
4

3 回答 3

34

当你这样做时:

widget.after(10, self.runBackup(mybackup))

...您是在告诉 Tkinter“运行命令runBackup,当它返回时,将结果用作after”的参数。因为runBackupreturns None,上面的等价于:

self.runBackup(mybackup)
widget.after(10, None)

相反,您希望引用after该函数,而不是调用该函数。如果命令需要参数,可以将这些参数作为附加参数提供。after

例如:

widget.after(10, self.runBackup, mybackup)
于 2012-06-14T22:47:16.207 回答
2

我会尝试 functools.partial 来包装你的电话,如下所示:

widget.after(10, functools.partial(self.runBackup, mybackup))

或者您可以定义一个不带参数但传递参数的本地函数(本质上就是 functools.partial 所做的)。

于 2012-06-14T19:55:09.553 回答
0

添加:使用 Lambda 函数格式,函数在多次递归调用后不会失败。例如:

Function abc(par):
           stat-1
           stat-2
           ...
           stat-n
           root.after(1000, lambda : abc(par))

    ...

(例如,在窗口左上方更新时钟非常有用...)

于 2019-04-24T21:18:25.803 回答