【发布时间】:2020-03-26 08:45:37
【问题描述】:
我认为使用 Python Turtle Graphics 制作动画的典型方法是像
def animate():
# move stuff
ontimer(animate, delay)
查看turtle 的源代码,它在后台实现tkinter after()。
有人可以解释为什么在下面的程序中,动画在运行时会急剧加速和减速吗?
我的理论是,由于每次调用ontimer() 时都会创建一个新的.after() id,因此存在多个相互干扰的计时器?或者这只是程序随机性的结果?或者回调之间的短间隔可能会导致问题?
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()
【问题讨论】:
-
应该是随机性造成的。
-
您运行过它并查看过它的行为吗?它看起来不仅仅是随机运动引起的变化。
-
是的,我有。只有
draw()(done()之前的除外)通过ontimer调用自己,所以不应该是多个ontimer任务的原因。 -
如果您查看来自
Screen.getcanvas().after(...)的ID,每次函数调用自身时都会创建一个新计时器。每一个都没有明确的破坏。通过在重复函数开始时显式销毁当前的.after()id,我设法修复了另一个程序中的错误。不过,关于这个程序,它的加速速度没有超出您对随机值的预期吗?
标签: python tkinter timer turtle-graphics