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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从tkinter widget.after函数传递参数相关的知识,希望对你有一定的参考价值。

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

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

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

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

另一答案

当你这样做:

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

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

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

    ...

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

以上是关于无法从tkinter widget.after函数传递参数的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter 无法从条目中解码表情符号

从函数设置串行对象(从 tkinter 交互调用)

如何从小部件的函数返回值,并将其传递给 Tkinter,Python 中的另一个小部件的函数

保存文件 Tkinter 不同的列

Python3.5、Win32gui、Tkinter。我无法从屏幕获取 Pixel

如何从 tkinter 条目为另一个函数生成位置参数