web-dev-qa-db-fra.com

Comment accélérer la fonction de tortue en python et l'empêcher de geler à la fin

J'ai écrit un programme tortue en python, mais il y a deux problèmes.

  1. Ça va beaucoup trop lentement pour un plus grand nombre, je me demandais comment accélérer la tortue.
  2. Il se fige après avoir terminé et lorsqu'il est cliqué, dit `` ne répond pas ''

Voici mon code jusqu'à présent:

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

Au fait: je suis sur la version 3.2!

17
clickonMe
  1. Définissez turtle.speed() sur fastest.
  2. Utilisez la fonctionnalité turtle.mainloop() pour travailler sans rafraîchir l'écran.
  3. Désactiver le rafraîchissement de l'écran avec turtle.tracer(0, 0) puis à la fin faire turtle.update()
33
kalgasnik

La tortue Python va très lentement car des rafraîchissements d'écran sont effectués après chaque modification apportée à une tortue.

Vous pouvez désactiver le rafraîchissement de l'écran jusqu'à ce que tout le travail soit terminé, puis peindre l'écran, cela éliminera les retards en millisecondes alors que l'écran essaie furieusement de mettre à jour l'écran à chaque changement de tortue.

Par exemple:

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)

Ce code fait mille tortues à des endroits aléatoires et affiche l'image en environ 200 millisecondes.

Si vous n'aviez pas désactivé le rafraîchissement de l'écran avec la commande turtle.tracer(0, 0), cela aurait pris plusieurs minutes pour essayer de rafraîchir l'écran 3000 fois.

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

12
Eric Leschinski

Pour référence, la tortue étant lente est un problème existant. Même avec une vitesse réglée au maximum, la tortue peut prendre assez de temps sur des choses comme les fractales. Nick ODell a réimplémenté la tortue pour la vitesse ici: 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
c0d3rman