使用Tkinter使用`after`设置工作流程

时间:2018-01-21 16:00:59

标签: python user-interface tkinter tkinter-canvas

我正在尝试使用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方法中指定的管道,该管道如下:

  • 1st:该消息在运行应用程序时显示文本“FIRST ...”
  • 第二名:2秒后,文字改变并显示“SECOND ......”
  • 3rd:4秒后,文本再次更改并显示“END”

但是,当我运行此示例时,GUI会等待4秒钟显示,并显示最终的“END”消息,而不会绘制先前的更改...

enter image description here

我做错了什么?

提前致谢

1 个答案:

答案 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有一些相似之处。