我正在尝试使用Tkinter的after
方法创建一个预定义的GUI工作流程(即管道),但它不起作用,我很困惑。
作为一个最小的例子,我创建了这个简单的GUI:
from tkinter import *
class example:
global frame, rect, text
def __init__(self):
self.root = Tk()
self.initialize()
self.workflow()
self.root.mainloop()
def initialize(self):
global frame, rect, text
# frame
frame = Canvas(self.root, width=500, height=500, bd=0, highlightthickness=0, relief='ridge')
frame.grid(row=0, column=0)
# rectangle
rect = frame.create_rectangle(20, 20, 400, 350, fill='blue')
# text
text = frame.create_text(250, 250, text='FIRST...', fill='#ffff00', font=("Purisa", 20, "bold"))
def change_message(self, new_message):
global frame, text
frame.itemconfig(text, text=new_message)
def workflow(self):
global frame, rect, text
self.root.after(2000, self.change_message("SECOND..."))
self.root.after(4000, self.change_message("END"))
myExample = example()
目标是遵循workflow
方法中指定的管道,该管道如下:
但是,当我运行此示例时,GUI会等待4秒钟显示,并显示最终的“END”消息,而不会绘制先前的更改...
我做错了什么?
提前致谢
答案 0 :(得分:2)
替换:
self.root.after(2000, self.change_message("SECOND..."))
self.root.after(4000, self.change_message("END"))
使用:
self.root.after(2000, lambda : self.change_message("SECOND..."))
self.root.after(4000, lambda : self.change_message("END"))
或者像Bryan 's suggestion一样,使用:
self.root.after(2000, self.change_message, "SECOND...")
self.root.after(4000, self.change_message, "END")
.after(ms, callback, *args)
需要callback
作为参考,而不是实际调用callback
函数。基本上从()
开始callback()
投降callback
。
传递callback()
代替callback
时,如:
widget.after(ms, callback(), *args)
python的行为大致相当于:
callback(*args)
time.sleep(ms / 1000)
延迟mainloop()
行的执行,因此GUI显示较晚。
这与how button commands work有一些相似之处。