web-dev-qa-db-ja.com

Pythonの「タートル」機能を高速化し、最後にフリーズを停止する方法

Pythonでturtleプログラムを作成しましたが、2つの問題があります。

  1. 数字が大きくなると速度が遅くなりすぎて、どうすれば亀をスピードアップできるのだろうかと思いました。
  2. 終了後、クリックするとフリーズし、「応答なし」と表示されます

これはこれまでの私のコードです:

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です!

17
clickonMe
  1. turtle.speed()fastestに設定します。
  2. turtle.mainloop()機能を使用して、画面を更新せずに作業を行います。
  3. turtle.tracer(0, 0)を使用して画面の更新を無効にし、最後にturtle.update()を実行します
33
kalgasnik

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

このコードは、ランダムな場所に1000匹のカメを作成し、約200ミリ秒で画像を表示します。

turtle.tracer(0, 0)コマンドで画面の更新を無効にしなかった場合、画面を3000回更新しようとすると数分かかりました。

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

12
Eric Leschinski

参考までに、カメが遅いことは既存の問題です。速度を最大に設定しても、カメはフラクタルのようなものに非常に長い時間がかかる可能性があります。ニックODellは、タートルの速度を再実装しました。 タートルウィンドウを非表示にしますか?

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