如何加速python的'乌龟'功能并最终阻止它冻结

时间:2013-04-20 11:48:53

标签: python graphics draw turtle-graphics

我在python中编写了一个海龟程序,但有两个问题。

  1. 对于较大的数字来说,它太慢了,我很想知道如何加速龟。
  2. 在完成后点击时会冻结,说“没有回应”
  3. 到目前为止,这是我的代码:

    import turtle
    
    #Takes user input to decide how many squares are needed
    f=int(input("How many squares do you want?"))
    c=int(input("What colour would you like? red = 1, blue = 2 and green =3"))
    n=int(input("What background colour would you like? red = 1, blue = 2 and green =3"))
    
    i=1
    
    x=65
    
    #Draws the desired number of squares.
    while i < f:
        i=i+1
        x=x*1.05
        print ("minimise this window ASAP")
        if c==1:
            turtle.pencolor("red")
        elif c==2:
            turtle.pencolor("blue")
        elif c==3:
            turtle.pencolor("green")
        else:
            turtle.pencolor("black")
        if n==1:
            turtle.fillcolor("red")
        elif n==2:
            turtle.fillcolor("blue")
        elif n==3:
            turtle.fillcolor("green")
        else:
            turtle.fillcolor("white")
        turtle.bk(x)
        turtle.rt(90)
        turtle.bk(x)
        turtle.rt(90)
        turtle.bk(x)
        turtle.rt(90)
        turtle.bk(x)
        turtle.rt(90)
        turtle.up()
        turtle.rt(9)
        turtle.down()
    

    顺便说一句:我在3.2版本上!

4 个答案:

答案 0 :(得分:33)

  1. turtle.speed()设为fastest
  2. 使用turtle.mainloop()功能无需刷新屏幕即可正常工作。
  3. 使用turtle.tracer(0, 0)停用屏幕刷新,然后在最后执行turtle.update()

答案 1 :(得分:10)

Python龟的速度非常慢,因为在对乌龟进行每次修改后都会执行屏幕刷新。

您可以禁用屏幕刷新,直到所有工作完成,然后绘制屏幕,​​它将消除毫秒延迟,因为屏幕疯狂地尝试从每次更改龟更新屏幕。

例如:

import turtle
import random
import time
screen = turtle.Screen()

turtlepower = []

turtle.tracer(0, 0)
for i in range(1000):
    t = turtle.Turtle()
    t.goto(random.random()*500, random.random()*1000)
    turtlepower.append(t)

for i in range(1000):
    turtle.stamp()

turtle.update()

time.sleep(3)

此代码在随机位置生成一千只海龟,并在大约200毫秒内显示图片。

如果您没有使用turtle.tracer(0, 0)命令禁用屏幕刷新,则尝试刷新屏幕3000次会花费几分钟时间。

https://docs.python.org/2/library/turtle.html#turtle.delay

答案 2 :(得分:3)

作为参考,龟慢是一个存在的问题。 即使速度设置为max,龟也可能需要很长时间才能完成分形。 Nick ODell在这里重新实现了龟的速度:Hide Turtle Window?

import math

class UndrawnTurtle():
def __init__(self):
    self.x, self.y, self.angle = 0.0, 0.0, 0.0
    self.pointsVisited = []
    self._visit()

def position(self):
    return self.x, self.y

def xcor(self):
    return self.x

def ycor(self):
    return self.y

def forward(self, distance):
    angle_radians = math.radians(self.angle)

    self.x += math.cos(angle_radians) * distance
    self.y += math.sin(angle_radians) * distance

    self._visit()

def backward(self, distance):
    self.forward(-distance)

def right(self, angle):
    self.angle -= angle

def left(self, angle):
    self.angle += angle

def setpos(self, x, y = None):
    """Can be passed either a tuple or two numbers."""
    if y == None:
        self.x = x[0]
        self.y = x[1]
    else:
        self.x = x
        self.y = y
    self._visit()

def _visit(self):
    """Add point to the list of points gone to by the turtle."""
    self.pointsVisited.append(self.position())

# Now for some aliases. Everything that's implemented in this class
# should be aliased the same way as the actual api.
fd = forward
bk = backward
back = backward
rt = right
lt = left
setposition = setpos
goto = setpos
pos = position

ut = UndrawnTurtle()

答案 3 :(得分:0)

我无法真正解决速度问题,但是可以通过在文件末尾使用turtle. done()来防止冻结,谢谢