Установить анимацию в Turtle - Python 3.4?

Код ниже создает фрактальное дерево. Я хочу нарисовать его как можно быстрее — я не хочу, чтобы происходила какая-либо анимация, иначе рисование займет много времени. В более ранних версиях Python это достигается с помощью turtle.speed(0), как показано ниже. Это не работает в питоне 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. Независимо от того, какое число (0-10) используется, это всегда одна и та же скорость и не отображается ошибка — это означает, что он все еще анимируется.

Как я могу добиться отсутствия анимации с черепахой в python 3.4? http://interactivepython.org/runestone/static/pythonds/Recursion/graphical.html Это хорошее место для запуска кода на Python 2, просто замените один из кодов Windows на мой.


person Lillz    schedule 01.08.2014    source источник
comment
Согласно документам, скорость = 0 означает отсутствие анимации по-прежнему имеет место в версии 3.4. Не могли бы вы предоставить более подробную информацию, чем не работает?   -  person jonrsharpe    schedule 01.08.2014
comment
Да, я видел документы. Кажется, модуль скорости ничего не делает в 3.4. Независимо от того, какое число (0-10) используется, это всегда одна и та же скорость и не отображается ошибка — это означает, что он все еще анимируется.   -  person Lillz    schedule 01.08.2014
comment
Возможно связано: bugs.python.org/issue21077   -  person jonrsharpe    schedule 01.08.2014
comment
Я не думаю, что это связано, так как мой все равно будет рисовать и работать, просто это занимает очень много времени (в зависимости от того, какие случайные диапазоны выбраны), поэтому я хочу, чтобы он не был анимирован.   -  person Lillz    schedule 01.08.2014
comment
Кто-нибудь знает, почему это не работает в 3.4?   -  person Lillz    schedule 01.08.2014


Ответы (2)


Я думаю, что использование turtle.tracer(False) было бы полезно, поскольку оно игнорирует анимацию.

person Erfan Pourmahdi Ebrahimi    schedule 17.12.2014

Во-первых, я рекомендую 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'), вероятно, перестанет иметь значение, поэтому вы можете при желании отбросить его.

введите здесь описание изображения

person cdlane    schedule 21.12.2018