无法从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,Python 中的另一个小部件的函数