Tkinter - создать мигающую графику на холсте?

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

Эта проблема:

Приведенный ниже код создает и удаляет прямоугольник внутри программы, но не отображает его в главном окне (корне).

from Tkinter import *
root = Tk()

def make():
    canvas.create_rectangle(20,20,60,60,fill="pink")
    root.after(1000)

def unmake():
    canvas.delete(ALL)
    root.after(1000)   

def loop():
    count = 0 
    while count < 5:
        make()
        unmake()
        count += 1

canvas = Canvas(root,width=100,height=100)
canvas.pack()  

loop()

root.mainloop()

Что я пробовал:

Если я помещаю инструкцию печати в функции make() и unmake(), они печатаются с интервалом в 1 секунду, поэтому я знаю, что метод .after() работает.

Если я создам бесконечный цикл с функцией make(), вызывающей unmake() и снова вызывающей make(), это действительно отобразит мигающий прямоугольник в главном окне (корне);

def make():
    box = canvas.create_rectangle(20,20,60,60,fill="pink")
    root.after(1000,unmake)

def unmake():
    canvas.delete(ALL)
    root.after(1000,make) 

Если кто-то знает, почему Tkinter ведет себя таким образом, я был бы очень признателен за руководство. Спасибо.


person bencoder    schedule 04.01.2015    source источник


Ответы (1)


after() не вызывает никаких функций в опубликованном коде. Следующий код иллюстрирует основную идею

from Tkinter import *
root = Tk()

def make():
    canvas.create_rectangle(20,20,60,60,fill="pink")
    root.after(1000, unmake)

def unmake():
    canvas.delete(ALL)
    root.after(1000, make)   

canvas = Canvas(root,width=100,height=100)
canvas.pack()  

make()

root.mainloop()
person Community    schedule 04.01.2015