首页 > 解决方案 > 乌龟使用睡眠控制刷新率不能正常刷新

问题描述

我通过使用 tracer(0, 0) 并标记海龟光标本身来控制海龟动画。

但是,它会奇怪地刷新,假设任何动画(带睡眠)之间的间隔为 1 秒,但它似乎有时会挂起两秒,然后在几秒后就位:在此处输入图像描述

代码是:

import turtle
import time

screen = turtle.Screen()
screen.listen()
screen.tracer(0, 0)

pen = turtle.Turtle()
pen.speed('fastest')
pen.shape("circle")
pen.penup()
pen.hideturtle()

next = [0, 8]

time.sleep(10)

while True:
    pen.goto(next[0]*20, next[1]*20)
    screen.clear()
    pen.stamp()
    screen.update()
    time.sleep(1)
    next = [next[0], next[1]-1]

似乎只是睡觉不是一个好主意。我似乎也很难让它与线程一起工作。在这种情况下,我如何使用预定义的时间(如 1 秒)?

标签: pythonpython-3.xturtle-graphicspython-turtle

解决方案


在像 turtle 这样的事件驱动的世界中使用sleepwhile True:循环是一个坏主意。我们可以改为使用计时器事件来产生您描述的效果。当我们在做的时候,我们会折腾冲压clear(),因为这不会添加任何东西, and也不是listen()

from turtle import Screen, Turtle

CURSOR_SIZE = 20

def drop():
    screen.update()
    turtle.sety(turtle.ycor() - CURSOR_SIZE)

    screen.ontimer(drop, 1000)  # 1 second

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.shape('circle')
turtle.penup()

turtle.sety(160)

screen.ontimer(drop, 10_000)  # 10 seconds

screen.mainloop()

当然,您需要添加一些逻辑以避免在圆圈从屏幕底部掉下时重新启动计时器事件。通过使用while True:循环,sleep()您可能会阻止事件(例如用户击键或窗口关闭)到达海龟。

这里的一个小错误是该drop()方法需要一些最少的时间来运行 - 考虑到这一点,如果需要/需要,您需要根据时钟时间或类似time.perf_counter()@AnnZen 演示的东西调整时间,但不是pass循环!

编辑: 在此处输入图像描述


推荐阅读