2015-03-22 2 views
2

Я искал простой анимационный код с Tkinter, но я нашел очень разные примеры, и я не могу понять, как правильно писать анимацию. Вот мой рабочий код, чтобы отобразить простую скользящую круг:Простая анимация с Tkinter Python

import tkinter as tk 
import time 

root=tk.Tk() 
canvas=tk.Canvas(root,width=400,height=400) 
canvas.pack() 
circle=canvas.create_oval(50,50,80,80,outline="white",fill="blue") 

def redraw(): 
    canvas.after(100,redraw) 
    canvas.move(circle,5,5) 
    canvas.update() 
canvas.after(100,redraw) 
root.mainloop() 

В этом коде я не могу правильно понять: (? До после метода), как работает после того, как метод, в котором правильно поставить обновление и метод перемещения , есть ли другой способ написать код анимации? можете ли вы отправить мне еще один пример и прокомментировать код, пожалуйста? Спасибо :)

+0

обновление не делает ничего, что вы хотите, чтобы произошло именно? –

+0

Мне нужна простая анимация, создайте многоугольник и переместите его в мое приложение. – Cassandra

+0

@PadraicCunningham: он ничего не делает - он на самом деле что-то делает. Он обрабатывает все ожидающие события события. –

ответ

1

Вызов update

Вы не должны вызывать canvas.update(). Как правило, вы должны никогда позвонить update.

Если вы выберете звонок canvas.update(), у вас есть способ сделать анимацию в программе tkinter.

Вызов after для запуска анимации

Вам не нужно звонить after непосредственно перед вызовом root.mainloop(). Это работает точно так же:

... 
redraw() 
root.mainloop() 

Выбор использовать или не использовать after в данном конкретном случае зависит от того, если вы хотите, чтобы анимация начать немедленно (возможно, даже до того, как виджет виден), или если вы хотите произойдет после короткой задержки (возможно, после того, как виджет становится видимым)

Как after работает

mainloop не более, чем бесконечный цикл, который проверяет очередь событий для событий. Когда он находит событие, он выталкивает его из списка и обрабатывает его. after - это не более чем запрос, в котором говорится: «Через 100 мс добавьте новое событие в очередь». По истечении срока действия в очередь добавляется событие, в котором говорится, что «запустите эту команду». В следующий раз, когда цикл проверяет события, он видит это событие, вытягивает его из очереди и запускает команду.

Когда вы вызываете after из метода, который сам был вызван after, вы говорите по сути «подождите 100 мс и делайте это снова», создавая бесконечный цикл. Если вы переместили вызов до after перед перемещением объекта, вы говорите: «каждые 100 мс запускают эту функцию». Если вы поместите его после того, как вы произнесете «запустите эту функцию через 100 мс после последнего запуска». Разница очень тонкая и обычно не ощущается, если ваша функция не занимает много времени.

0

мой код:

from tkinter import * 
import time 
tk = Tk() 
płótno = Canvas(tk, width=500, height=500) 
płótno.pack() 
płótno.create_polygon(10,10,10,70,70,10,fill="blue",outline="black") 
for x in range(0,51): 
    płótno.move(1,5,0) 
    płótno.update() 
    rest(0.05) 

płótno означает холст