Я думал, что канонический способ сделать анимацию с Python Turtle Graphics заключается в том, чтобы сделать что-то вроде
def animate():
# move stuff
ontimer(animate, delay)
Изучая исходный код для turtle
, он реализует tkinter
after()
в background.
Может кто-нибудь объяснить, почему в приведенной ниже программе анимация значительно ускоряется и замедляется, когда она остается запущенной?
Моя теория состоит в том, что, поскольку каждый раз создается новый .after()
идентификатор ontimer()
называется, существуют ли как-то несколько таймеров, которые мешают друг другу? А может это просто случайность в программе? Или, может быть, короткий интервал между обратными вызовами вызывает проблемы?
from random import *
from turtle import *
import math
class Vector(object):
def __init__(self, x = 0.0, y = 0.0):
self.x = x
self.y = y
def move(self, other):
""" Move vector by other (in-place)."""
self.__iadd__(other)
def __iadd__(self, other):
if isinstance(other, Vector):
self.x += other.x
self.y += other.y
else:
self.x += other
self.y += other
def rotate(self, angle):
"""Rotate vector counter-clockwise by angle (in-place)."""
radians = angle * math.pi / 180.0
cosine = math.cos(radians)
sine = math.sin(radians)
x = self.x
y = self.y
self.x = x * cosine - y * sine
self.y = y * cosine + x * sine
ant = Vector(0, 0)
aim = Vector(2, 0)
def wrap(value):
"Wrap value around -200 and 200."
if value > 200:
value = -200
elif value < -200:
value = 200
return value
def draw():
"Move ant and draw screen."
ant.move(aim)
ant.x = wrap(ant.x)
ant.y = wrap(ant.y)
aim.move(random() - 0.5)
aim.rotate(random() * 10 - 5)
clear()
goto(ant.x, ant.y)
dot(10)
if running:
ontimer(draw, 50)
setup(420, 420, 370, 0)
hideturtle()
tracer(False)
up()
running = True
draw()
done()