Как быстро отменить черепаху? - PullRequest
2 голосов
/ 13 марта 2019

Я делаю программу, которая создает спирограф. Это мой код:

from turtle import *
from random import randint
speed(10000)
for i in range(20):
    col = randint(1, 5)
    if col == 1:
        pencolor("orange")
    elif col == 2:
        pencolor("blue")
    elif col == 3:
        pencolor("green")
    elif col == 4:
        pencolor("purple")
    elif col == 5:
        pencolor("dark blue")
    circle(50)
    left(20)

while undobufferentries():
    undo()

Однако последняя часть программы - это проблема. Я хочу, чтобы эта часть, отмена, была очень быстрой, такой же быстрой, как был создан спиро. Как сделать отмену очень быстро ??

1 Ответ

1 голос
/ 13 марта 2019

Трижды вы говорите, что хотите «очень быстро», но вы также говорите «так быстро, как был создан спиро». Мы можем легко сделать это быстрее, чем был создан spiro, но немного больше работы, чтобы сделать его «настолько быстрым».

Эта проблема указывает на низ живота механизма undo(). Чтобы отменить только один из ваших кругов, включает в себя последовательность из более чем 80 шагов. Но даже это не дает полной ясности, почему это так медленно. Если мы отключаем обновления экрана, мы можем сделать это мгновенно. Но если это приемлемо, то вы также можете заменить undo() на clear().

Я редко призываю людей возиться с tracer(), и даже когда я это делаю, я обычно пишу примеры, которые делают простые tracer(False) и tracer(True), чтобы избежать числового аргумента. Но это тот редкий случай, когда мы хотим, чтобы конкретный числовой аргумент tracer() контролировал скорость графики undo():

from turtle import *
from random import choice

COLORS = ["orange", "blue", "green", "purple", "dark blue"]

hideturtle()
speed('fastest')

for _ in range(20):
    pencolor(choice(COLORS))
    circle(50)
    left(20)

tracer(20)  # value unrelated to either 20 above
while undobufferentries() > 1:
    undo()  # undo everything but hideturtle()
tracer(1)

exitonclick()

В моей системе отмена чертежа теперь имеет ту же скорость, что и do , но вам может потребоваться точная настройка аргумента на tracer() для достижения эффекта ты хочешь.

...