【问题标题】:How to Increase Delay on turtle.tracer()? [PYTHON]如何增加turtle.tracer() 的延迟? [PYTHON]
【发布时间】:2020-04-02 19:46:39
【问题描述】:

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

在这一点上我很困惑。我不确定,我可能缺少一个非常明显的解决方案。

谢谢!

【问题讨论】:

    标签: python pyzo python-turtle


    【解决方案1】:

    我终于找到了答案!

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

    希望这对任何人都有帮助!

    【讨论】:

      【解决方案2】:

      你不需要也不想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() 的第二个参数,它是再次调用此方法之前的时间延迟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多