Python矩形彩色动画

Python矩形彩色动画,python,tkinter,Python,Tkinter,我怎样才能制作第三个按钮,将矩形从灰色一个接一个地变成红色。示例:矩形1亮起,然后等待一秒钟,然后矩形2亮起。我试着在每一个w.create_矩形之间放置time.sleep,但这不起作用。我该怎么做,请帮帮我 import time master = Tk() canvas_width = 280 canvas_height = 50 w = Canvas(master, width=canvas_width, height=canvas_height) w.pack() w.create

我怎样才能制作第三个按钮,将矩形从灰色一个接一个地变成红色。示例:矩形1亮起,然后等待一秒钟,然后矩形2亮起。我试着在每一个w.create_矩形之间放置time.sleep,但这不起作用。我该怎么做,请帮帮我

import time
master = Tk()

canvas_width = 280
canvas_height = 50
w = Canvas(master, width=canvas_width, height=canvas_height)
w.pack()

w.create_rectangle(0, 0, 25, 25, fill="grey")
w.create_rectangle(25, 0, 50, 25, fill="grey")
w.create_rectangle(50, 0, 75, 25, fill="grey")
w.create_rectangle(75, 0, 100, 25, fill="grey")
w.create_rectangle(100, 0, 125, 25, fill="grey")
w.create_rectangle(125, 0, 150, 25, fill="grey")
w.create_rectangle(150, 0, 175, 25, fill="grey")
w.create_rectangle(175, 0, 200, 25, fill="grey")
w.create_rectangle(200, 0, 225, 25, fill="grey")
w.create_rectangle(225, 0, 250, 25, fill="grey")

def uno():
    w.create_rectangle(0, 0, 25, 25, fill="red")
    w.create_rectangle(25, 0, 50, 25, fill="red")
    w.create_rectangle(50, 0, 75, 25, fill="red")
    w.create_rectangle(75, 0, 100, 25, fill="red")
    w.create_rectangle(100, 0, 125, 25, fill="red")
    w.create_rectangle(125, 0, 150, 25, fill="red")
    w.create_rectangle(150, 0, 175, 25, fill="red")
    w.create_rectangle(175, 0, 200, 25, fill="red")
    w.create_rectangle(200, 0, 225, 25, fill="red")
    w.create_rectangle(225, 0, 250, 25, fill="red")
def dos():  
    w.create_rectangle(0, 0, 25, 25, fill="grey")
    w.create_rectangle(25, 0, 50, 25, fill="grey")
    w.create_rectangle(50, 0, 75, 25, fill="grey")
    w.create_rectangle(75, 0, 100, 25, fill="grey")
    w.create_rectangle(100, 0, 125, 25, fill="grey")
    w.create_rectangle(125, 0, 150, 25, fill="grey")
    w.create_rectangle(150, 0, 175, 25, fill="grey")
    w.create_rectangle(175, 0, 200, 25, fill="grey")
    w.create_rectangle(200, 0, 225, 25, fill="grey")
    w.create_rectangle(225, 0, 250, 25, fill="grey")


button1 = Button(master, text="zasviet", command=uno)
button1.pack(side='left', padx=10)
button2 = Button(master, text="zhasni", command=dos)
button2.pack(side='left', padx=10)
button3 = Button(master, text="animacia", command=tres)
button3.pack(side='left', padx=10)
决不能在Tkinter使用的同一线程中使用sleep。由于Tkinter是一个单线程GUI,如果希望GUI正常工作,就不能使用睡眠和阻止主循环的东西,如while语句

相反,您希望使用after,因为这正是它的设计目的。在不使用睡眠的情况下及时处理事情

之后需要进行一些争论。第一个是以毫秒为单位的时间,因此一秒钟是1000毫秒。第二个是您正在调用的函数名,第三个可以是参数。它看起来像这个root.after1000,func_name,arg

在这种情况下,我们应该在一个列表中创建所有画布对象,这样我们以后就可以简单地用您想要的颜色更新这些对象,而不是在上一个列表上重新创建对象

在下面的代码中,我对您的代码进行了一些清理,并添加了执行此任务的功能。如果你有任何问题,请告诉我

import tkinter as tk


master = tk.Tk()
rectangle_list = []
canvas_width = 280
canvas_height = 50
w = tk.Canvas(master, width=canvas_width, height=canvas_height)
w.pack()


# Create the list of rectangle objects to be used later.
for i in range(10):
    x = i * 25
    if i == 1:
        rectangle_list.append(w.create_rectangle(0, 0, 25, 25, fill="grey"))
    else:
        rectangle_list.append(w.create_rectangle(x-25, 0, x, 25, fill="grey"))


# manage color change loop based on index of rectangle list.
def uno(ndex=0):
    if ndex < len(rectangle_list):
        w.itemconfig(rectangle_list[ndex], fill='red')
        master.after(1000, uno, ndex+1)


def dos(ndex=0):
    if ndex < len(rectangle_list):
        w.itemconfig(rectangle_list[ndex], fill='grey')
        master.after(1000, dos, ndex+1)


tk.Button(master, text="zasviet", command=uno).pack(side='left', padx=10)
tk.Button(master, text="zhasni", command=dos).pack(side='left', padx=10)
tk.Button(master, text="animacia").pack(side='left', padx=10)
master.mainloop()
下图仅说明颜色正在按顺序更改,您可以在颜色更改期间按多个按钮来创建图案


你能详细解释一下这是怎么不起作用的吗?它等待了我放在时间括号里的秒数。睡眠,然后它同时将所有的矩形变成红色。不要在tkinter中使用睡眠。Tkinter是一个单线程应用程序,因此睡眠会阻塞主循环。下一步我将更新你的对象,而不是在旧对象的基础上绘制新对象。