无法从Tkinter的widget.after函数传递参数(Cannot pass argument

2019-06-25 11:48发布

我使用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,“请稍候”的消息一直没有出现。

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

Answer 1:

我会尝试functools.partial来包装你的电话为:

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

或者你可以定义一个本地函数不带任何参数,但传递的参数(这在本质上是functools.partial做什么)。



Answer 2:

当你这样做:

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)


Answer 3:

地址:使用lambda函数的格式,功能doesn't经过多次递归调用失败。 例如:

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

    ...

(it's非常有用的更新在窗口的左侧,顶部的时间时钟,例如...)



文章来源: Cannot pass arguments from the tkinter widget.after function