Python Tkinter中的item.config一起执行
我使用Tkinter在python2.7中编写代码。 我需要一组矩形来一个接一个地改变颜色。但是,当我在函数中一个接一个地编写item.config时,它们会在执行结束时一起执行Python Tkinter中的item.config一起执行,python,tkinter,Python,Tkinter,我使用Tkinter在python2.7中编写代码。 我需要一组矩形来一个接一个地改变颜色。但是,当我在函数中一个接一个地编写item.config时,它们会在执行结束时一起执行 def button(self): print "hi" self.canvas.itemconfig(self.figure1, fill="green") time.sleep(3) print "hello" sel
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。为什么会发生这种情况,有什么建议和想法吗?
谢谢 下面是一个简单的示例,演示如何在保持Tk事件循环运行的同时执行一系列操作来延迟事件。我只有Python3,因此您可能需要稍微修改才能使用Python2.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事件队列,以便您稍后运行,如果您捕获after令牌,您甚至可以取消它们(例如,如果您需要某个超时功能)。感谢您的输入!但是如果我想在两个切换函数调用之间执行一些步骤,比如说print语句,那么颜色变化似乎同时发生。root=Tk()canvas=canvas(root,background=“white”)canvas.pack(fill='both',expand=True)figure1=canvas.create_rectangle(10,80,80,fill=“red”)figure2=canvas.create_rectangle(100,10180,80,fill=“red”)图3=canvas.create_rectangle(200,10280,80,fill=“red”)canvas.after(1000,lambda:toggle(canvas,[figure1])打印“hello”canvas.after(1000,lambda:toggle(canvas,[figure2])root.mainloop()@AbinayaSegar您将之后的调用设置为1000,因此这两个调用都将在一秒钟后执行。试着将第二次的时间设置为2000。请记住,对after
的调用会立即返回,并计划稍后执行任务,因此两个after调用和print语句几乎会同时执行。哦!非常感谢你的帮助!我假设在上一个语句后1000毫秒执行。现在我明白了:)