如何增加turtle.tracer()的延迟?[PYTHON]

2024-06-26 10:43:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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时,没有闪烁,但这也意味着动画以基本速度运行,因此没有效果。当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()

在这一点上我很困惑。也许有一个很明显的解决方案我没有,我不确定

谢谢


Tags: truedeflengthtracercanvasturtlewhilesketcher
2条回答

你不需要,也不想要。首先,您需要根据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:,它在像turtle这样的事件驱动环境中没有位置。请注意ontimer()的第二个参数,它是再次调用此方法之前的时间延迟

我终于找到了答案

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

希望这对任何人都有帮助

相关问题 更多 >