Tkinter中的item.config一起执行

时间:2015-05-31 18:28:18

标签: python tkinter

我使用Tkinter在python2.7中编码。 我需要一组矩形来一个接一个地改变颜色。但是当我在我的函数中一个接一个地编写item.config时,它们会在执行结束时一起执行。

 def button(self):        
        print "hi"
        self.canvas.itemconfig(self.figure1, fill="green")
        time.sleep(3)
        print "hello"
        self.canvas.itemconfig(self.figure2, fill="green")
        time.sleep(3)
        print "okay"
        time.sleep(3)
        self.canvas.itemconfig(self.figure3, fill="green")

当我运行它时,所有打印语句都完成,然后三个数字一起改变颜色。我需要它在每个语句被执行/打印时一个接一个地改变。

我是Python和Tkinter的新手。有什么建议和想法为什么会这样? 谢谢!

1 个答案:

答案 0 :(得分:2)

这是一个简单的示例,演示了如何使用after执行一系列操作来延迟事件,同时保持Tk事件循环运行。我只有Python 3,所以你可能需要稍微修改才能使用Python 2.7。

#!/usr/bin/python

from tkinter import *

def toggle(canvas, items):
    if len(items) > 0:
        canvas.itemconfigure(items[0], fill="green")
        canvas.after(1000, lambda: toggle(canvas, items[1:]))
    return

root = Tk()
canvas = Canvas(root, background="white")
canvas.pack(fill='both', expand=True)
figure1 = canvas.create_rectangle(10,10,80,80, fill="red")
figure2 = canvas.create_rectangle(100,10,180,80, fill="red")
figure3 = canvas.create_rectangle(200,10,280,80, fill="red")
canvas.after(1000, lambda: toggle(canvas, [figure1, figure2, figure3]))
root.mainloop()

保持事件循环运行至关重要。除非您创建工作线程,否则不能在GUI应用程序中使用sleep。通常你不需要。 after调用将任务放入UI事件队列,以便稍后运行,如果捕获后令牌,您甚至可以取消它们(例如,如果您需要超时功能的话)。