我使用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的新手。有什么建议和想法为什么会这样? 谢谢!
答案 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事件队列,以便稍后运行,如果捕获后令牌,您甚至可以取消它们(例如,如果您需要超时功能的话)。