Цветовая анимация прямоугольника Python - PullRequest
0 голосов
/ 19 сентября 2019

Как я могу сделать третью кнопку, которая превращает прямоугольники из серого в красный, одну за другой.(Пример: загорается прямоугольник 1, затем он ждет секунду, а затем загорается прямоугольник 2).Я попытался сделать это, поместив time.sleep () между каждым w.create_rectangle, но это не сработало.Как я могу это сделать, пожалуйста, помогите мне.

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)

1 Ответ

1 голос
/ 19 сентября 2019

Вы никогда не должны использовать sleep() в том же потоке, который использует Tkinter.Поскольку Tkinter является однопоточным графическим интерфейсом, вы не можете использовать sleep() и вещи, которые блокируют основной цикл, такие как операторы while, если вы хотите, чтобы ваш графический интерфейс работал правильно.

Вместо этого вы хотите использовать after() какэто именно то, для чего он предназначен.Чтобы управлять вещами мудро, не используя sleep().

after(), требуется несколько аргументов.1 - время в миллисекундах, поэтому одна секунда - 1000 миллисекунд.Второе - это имя функции, которую вы вызываете, а третье может быть аргументом.Это будет выглядеть примерно так: root.after(1000, 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()

На изображении ниже просто показано, что цвета меняются по порядку, и вы можете нажать более одной кнопки во время изменения цвета, чтобы создать рисунок.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...