如何增加 turtle.tracer() 的延迟? [PYTHON]
How to Increase Delay on turtle.tracer()? [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 时,没有闪烁。但是,它对我的目的来说太快了。我尝试更改 "delay" 值,但无济于事:
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()
我很困在这一点上。我不确定可能有一个非常明显的解决方案,但我不确定。
谢谢!
我终于找到了答案!
在 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()
希望对大家有所帮助!
你不需要,也不想要,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:
,它在像 turtle 这样的事件驱动环境中没有位置。注意 ontimer()
的第二个参数,它是再次调用此方法之前的时间延迟。
我正在 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 时,没有闪烁。但是,它对我的目的来说太快了。我尝试更改 "delay" 值,但无济于事:
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()
我很困在这一点上。我不确定可能有一个非常明显的解决方案,但我不确定。
谢谢!
我终于找到了答案!
在 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()
希望对大家有所帮助!
你不需要,也不想要,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:
,它在像 turtle 这样的事件驱动环境中没有位置。注意 ontimer()
的第二个参数,它是再次调用此方法之前的时间延迟。