Анимировать цвет прямоугольника - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу изменить цвет прямоугольника через определенный промежуток времени.

Я пробовал метод root.after (), но он не работает.

    import time
    from tkinter import *

    def task():
      canvas= Canvas()
      canvas.create_rectangle(0,0,100,100,fill='red')
      canvas.pack()
      time.sleep(2)
      canvas.create_rectangle(0,0,100,100,fill='blue')
      canvas.pack()
      time.sleep(2)
      print("Testing...")


    root = Tk()
    canvas = Canvas(root)
    while(1):
      task()
      root.mainloop()

Данный код работает постоянно и корневые окна зависают на определенное время. Цвет прямоугольника должен измениться после 2 секунд задержки.

1 Ответ

1 голос
/ 24 апреля 2019

Использование time.sleep() приводит к зависанию окна и цикла while.Чтобы использовать time.sleep в tkinter, мы используем after(ms) (мс-миллисекунды) в функциях, чтобы графический интерфейс не зависал.

Хотя делает то же самое, поэтому мы используем функцию after(ms, callback, args).

Вот пример того, чего вы пытаетесь достичь.Прямоугольник меняет свой цвет каждые 1000 мс (1 сек) с красного на синий - с синего на красный и так далее.Также в вашем коде вы создавали новый холст и прямоугольник каждые 4 секунды.Я определил один холст и один прямоугольник вне функции task() и дал прямоугольнику тег (tag='rect') для ссылки, через которую можно редактировать цвет этого прямоугольника без создания ненужных элементов.Я надеюсь, что это помогло вам.

Пример:

from tkinter import *

root = Tk()
canvas = Canvas(root)
canvas.pack()
canvas.create_rectangle(0,0,100,100,fill='red', tag='rect')

def task():
    l = root.after(1000, task)

    if int(l.split('#')[1]) % 2 == 0:
        canvas.itemconfig('rect', fill='blue')
    else: 
        canvas.itemconfig('rect', fill='red')

task()

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