Как увеличить задержку на turtle.tracer ()? [ПИТОН] - PullRequest
0 голосов
/ 02 апреля 2020

Я делаю тренировочный проект в Pyzo, и у меня возникают некоторые проблемы с turtle.tracer ().

Когда n = / = 0 или 1, я сталкиваюсь с проблемой, когда объекты на экране начинают мерцать.

import turtle
sketcher = turtle.Turtle()
canvas = turtle.Screen()

sketcher.speed(0)
sketcher.hideturtle()

def drawPinwheelAnimation(length):
    sketcher.setheading(90)
    backwardLength = length
    lengthChange = 1
    while(True):
        canvas.tracer(36)
        drawPinwheel(0, 0, length, backwardLength)
        drawPinwheel(3*length, 0, length, backwardLength)
        drawPinwheel(0, 3*length, length, backwardLength)
        drawPinwheel(-3*length, 0, length, backwardLength)
        drawPinwheel(0, -3*length, length, backwardLength)
        canvas.update()
        backwardLength += lengthChange
        if(backwardLength == (1.5*length) or backwardLength == (0.5*length)):
            lengthChange *= -1
        sketcher.clear()

def drawSwingingPinwheel(xPos, yPos, initialLength):
    while(True):
        drawPinwheel(xPos, yPos, forwardLength, backwardLength)
        backwardLength += lengthChange
        if(backwardLength == (1.5*initialLength) or backwardLength == (0.5*initialLength)):
            lengthChange *= -1
        sketcher.clear()


def drawPinwheel(xPos, yPos, fdLength, bkLength):
    sketcher.penup()
    sketcher.setpos(xPos, yPos)
    sketcher.pendown()
    for side in range(12):
        sketcher.fd(fdLength)
        sketcher.bk(bkLength)
        sketcher.rt(30)

drawPinwheelAnimation(50)

turtle.mainloop()

Когда n = 1, мерцание отсутствует, но это также означает, что анимация в любом случае идет со скоростью c, поэтому она не оказывает никакого эффекта. Когда n = 0, мерцания нет. Тем не менее, это слишком быстро для моих целей. Я попытался изменить значение «задержки», но безрезультатно:

        canvas.tracer(0, 1000) #Changing the second value to 1000 has no notable difference.
        drawPinwheel(0, 0, length, backwardLength)
        drawPinwheel(3*length, 0, length, backwardLength)
        drawPinwheel(0, 3*length, length, backwardLength)
        drawPinwheel(-3*length, 0, length, backwardLength)
        drawPinwheel(0, -3*length, length, backwardLength)
        canvas.update()

Я застрял в этой точке. Возможно, есть довольно очевидное решение, которое я пропускаю, я не уверен.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Вам не нужно и не нужно, time.sleep(). Во-первых, вам нужно правильно расположить свою программу в соответствии с tracer() и update():

from turtle import Screen, Turtle

def drawPinwheelAnimation(length, lengthChange=1, backwardLength=None):
    if backwardLength is None:
        backwardLength = length

    turtle.clear()

    drawPinwheel(0, 0, length, backwardLength)
    drawPinwheel(3*length, 0, length, backwardLength)
    drawPinwheel(0, 3*length, length, backwardLength)
    drawPinwheel(-3*length, 0, length, backwardLength)
    drawPinwheel(0, -3*length, length, backwardLength)

    screen.update()

    backwardLength += lengthChange

    if backwardLength == (1.5*length) or backwardLength == 0.5*length:
        lengthChange *= -1

    screen.ontimer(lambda: drawPinwheelAnimation(length, lengthChange, backwardLength), 100)

def drawPinwheel(xPos, yPos, fdLength, bkLength):
    turtle.penup()
    turtle.setpos(xPos, yPos)
    turtle.pendown()

    for _ in range(12):
        turtle.forward(fdLength)
        turtle.backward(bkLength)
        turtle.right(30)

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.setheading(90)

drawPinwheelAnimation(50)

screen.mainloop()

Во-вторых, я заменил вашу while True:, которой нет места в среде, управляемой событиями, такой как черепаха, с таймером события. Запишите второй аргумент ontimer(), который представляет собой задержку перед повторным вызовом этого метода.

0 голосов
/ 07 апреля 2020

В итоге я нашел ответ!

Есть функция, которую можно использовать после Screen.update (), которая называется time.sleep (). Если вы поместите значение в time.sleep (), оно будет приостановлено на столько секунд, прежде чем обновится еще раз.

Например, я исправил свой собственный код, выполнив следующее:

import turtle
import time
sketcher = turtle.Turtle()
canvas = turtle.Screen()

sketcher.speed(0)
sketcher.hideturtle()

def drawPinwheelAnimation(length):
    sketcher.setheading(90)
    backwardLength = length
    lengthChange = 1
    while(True):
        canvas.tracer(0)
        drawPinwheel(0, 0, length, backwardLength)
        drawPinwheel(3*length, 0, length, backwardLength)
        drawPinwheel(0, 3*length, length, backwardLength)
        drawPinwheel(-3*length, 0, length, backwardLength)
        drawPinwheel(0, -3*length, length, backwardLength)
        canvas.update()
        time.sleep(.01) # <-------- Here's the time.sleep() function!
        backwardLength += lengthChange
        if(backwardLength == (1.5*length) or backwardLength == (0.5*length)):
            lengthChange *= -1
        sketcher.clear()

def drawSwingingPinwheel(xPos, yPos, initialLength):
    while(True):
        drawPinwheel(xPos, yPos, forwardLength, backwardLength)
        backwardLength += lengthChange
        if(backwardLength == (1.5*initialLength) or backwardLength == (0.5*initialLength)):
            lengthChange *= -1
        sketcher.clear()


def drawPinwheel(xPos, yPos, fdLength, bkLength):
    sketcher.penup()
    sketcher.setpos(xPos, yPos)
    sketcher.pendown()
    for side in range(12):
        sketcher.fd(fdLength)
        sketcher.bk(bkLength)
        sketcher.rt(30)

drawPinwheelAnimation(50)

turtle.mainloop()

Надеюсь, это кому-нибудь поможет!

...