在Python 3.4中如何取消Turtle动画?
下面的代码是用来画一个分形树的。我想尽快画出来,不想有任何动画效果,因为那样会花很长时间才能完成。在早期的Python版本中,可以通过使用turtle.speed(0)来实现这个效果,如下所示。但在Python 3.4中,这个方法不起作用。
import turtle
import random
red = 125
green = 70
blue = 38
pen = 10
def tree(branchLen, t, red, green, blue, pen):
if branchLen > 3:
pen = pen*0.8
t.pensize(pen)
red = red - 15
green = green + 8
if branchLen > 5:
angle = random.randrange(10, 70)
angleTwo = 0.50*angle
sub = (0.8*(random.randrange(1,24)))
t.forward(branchLen)
t.right(angleTwo)
tree(branchLen-sub,t, red, green, blue, pen)
t.left(angle)
tree(branchLen-sub, t, red, green, blue, pen)
t.right(angleTwo)
t.backward(branchLen)
def main():
t = turtle.Turtle()
t.hideturtle()
t.speed(0)
myWin = turtle.Screen()
t.left(90)
t.up()
t.backward(170)
t.down()
tree(random.randrange(40,47),t,red,green,blue, pen)
myWin.exitonclick()
main()
看起来在3.4版本中,speed模块没有任何效果。无论你用什么数字(0到10),速度都是一样的,而且没有显示错误信息——这意味着它还是会有动画效果。
那么在Python 3.4中,怎么才能让turtle不出现动画呢?http://interactivepython.org/runestone/static/pythonds/Recursion/graphical.html 这是一个很好的地方,可以在Python 2中运行代码,只需把其中一个窗口的代码换成我的代码就可以了。
3 个回答
在这里,你需要先使用以下代码:
screen = Screen() - 这行代码是用来获取屏幕模块的。
screen.tracer(0) - 这行代码是用来关闭所有动画的。
接下来,在某个步骤中,你需要用
screen.update() - 这行代码来开启动画。
首先,我建议用 speed('fastest')
代替 speed(0)
,这样能更清楚地表达你的意图。其次,在考虑使用 tracer(False)
之前,先确保你的代码是最优的。最后,当你完成绘图后,记得总是使用 tracer(True)
,因为如果没有重新开启追踪,一些操作可能不会按预期工作(比如在代码最后使用 hideturtle()
时)。
关于我的第二个建议,你的 if branchLen > 3:
和 if branchLen > 5:
的组合其实没什么实际区别,直接用 if branchLen > 5:
就可以了。你在传递颜色并对它们进行操作,但实际上并没有真正使用它们——如果想要更快的速度,就把不完整的代码删掉。此外,还有一些小的优化:
from turtle import Screen, Turtle
from random import randrange
PEN_SIZE = 8
def tree(branch_length, turtle, pen_size):
if branch_length < 5:
return
angle = randrange(5, 35)
double_angle = angle * 2
sub_length = branch_length - randrange(1, 19)
turtle.pensize(pen_size)
pen_size *= 0.8
turtle.forward(branch_length)
turtle.right(angle)
tree(sub_length, turtle, pen_size)
turtle.left(double_angle)
tree(sub_length, turtle, pen_size)
turtle.right(angle)
turtle.backward(branch_length)
def main():
myWin = Screen()
yertle = Turtle(visible=False)
yertle.left(90)
yertle.penup()
yertle.backward(170)
yertle.pendown()
myWin.tracer(False)
tree(randrange(40, 47), yertle, PEN_SIZE)
myWin.tracer(True)
myWin.exitonclick()
main()
一旦你决定使用 tracer(False)
,那么 speed('fastest')
可能就没什么效果了,所以你可以选择把它去掉。
我觉得使用 turtle.tracer(False)
这个命令会很有用,因为它可以让你忽略动画效果。