无法从tkinter widget.after函数传递参数

时间:2012-06-14 19:32:49

标签: python popup window tkinter arguments

我正在使用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()

3 个答案:

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

    ...

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