在Python 3.4中如何取消Turtle动画?

5 投票
3 回答
14396 浏览
提问于 2025-04-18 15:39

下面的代码是用来画一个分形树的。我想尽快画出来,不想有任何动画效果,因为那样会花很长时间才能完成。在早期的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 个回答

0

在这里,你需要先使用以下代码:
screen = Screen() - 这行代码是用来获取屏幕模块的。
screen.tracer(0) - 这行代码是用来关闭所有动画的。
接下来,在某个步骤中,你需要用
screen.update() - 这行代码来开启动画。

2

首先,我建议用 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') 可能就没什么效果了,所以你可以选择把它去掉。

enter image description here

3

我觉得使用 turtle.tracer(False) 这个命令会很有用,因为它可以让你忽略动画效果。

撰写回答