如何非常快速地撤消乌龟?

How to undo in turtle very fast?

我正在制作一个可以创建呼吸描记器的程序。这是我的代码:

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()

但是,程序的最后一部分是有问题的。我希望那个部分,撤消,非常快,就像创建 spiro 一样快。如何快速撤销??

三次你说你想要它"very fast",但你还说,"as fast as the spiro was created"。我们可以很容易地让它比 spiro 的创建速度更快,但只需要稍微多一些工作就可以做到 "as fast".

这个问题指出了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()

在我的系统上,绘图的撤消现在与执行的速度相同,但您可能需要微调tracer() 的参数以实现您想要的效果。