Как ускорить функцию "черепаха" python и остановить ее замораживание в конце

Я написал программу черепахи в python, но есть две проблемы.

  • Это слишком медленно для больших чисел, мне было интересно, как я могу ускорить черепаху.
  • Он зависает после завершения и при нажатии, говорит "не отвечает"

Это мой код:

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!

Ответ 1

  • Установите turtle.speed, чтобы ускорить выполнение.
  • Используйте функцию turtle.mainloop() для работы без обновления экрана.
  • Отключить обновление экрана с помощью turtle.tracer(0, 0), затем в конце do turtle.update()

Ответ 2

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

Ответ 3

Для справки, черепаха, являющаяся медленной, является существующей проблемой. Даже при скорости, установленной до макс, черепаха может занимать довольно много времени на таких вещах, как фракталы. Ник Оделл переориентировал черепаху на скорость здесь: Скрыть окно черепахи?

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