使用Sleep(),Python运动中的代码并不平滑



编写了一个函数,该功能将左右移动到循环中的边缘。我希望它会以恒定的速度移动。实际发生的是运动很粗糙。运动将改变其速度。如何使其以恒定的速度移动?

def btn_start_press():
    global x1, x2, y1, y2, canvas_width
    size = int(entry_size.get())
    x2 = x1 + size
    y2 = y1 + size
    label_size["text"] = size * 2
    forward = True
    while True:
        if forward:
            x1 += 1
            x2 += 1
        else:
            x1 -= 1
            x2 -= 1
        if x2 + size >= canvas_width:
            forward = False
        elif x1 <= 0 :
            forward = True
        time.sleep(0.005)
        canvas.coords(rect,x1,y1,x2,y2)
        canvas.update()

在您的计算机外部,计算机在代码之外发生了很多事情,这意味着您的代码不是唯一争夺资源的东西。在您的情况下,这最终是循环不需要每次迭代的时间相同的时间,因此最终以锯齿状的移动。在您的情况下,睡眠时间也很低,以至于将大量时间分配给您的申请。

在这种情况下,可能会正常工作的天真修复程序是使用两个重复之间的经过的时间,并使用计算移动按钮的程度。

如果您使用time.sleep(0.015),您的应用程序将尝试以约75 fps(减去代码中花费的时间(运行其代码。您可以使用time.time()获得当前时间(使用毫秒(。请注意,这次信息可能相当粗糙,并且还有其他问题(例如,如果调整了计算机时钟,则更改(。有更好的计时器,但是对于此用例,应该足够好。

pixels_per_second = 100
previous_time = time.time()
while True:
    new_time = time.time()
    elapsed = new_time - previous_time
    pixels = pixels_per_second * elapsed
    if forward:
        x1 += pixels
        x2 += pixels
    else:
        x1 -= pixels
        x2 -= pixels
    if x2 + size >= canvas_width:
        forward = False
    elif x1 <= 0 :
        forward = True
    previous_time = new_time
    canvas.coords(rect,x1,y1,x2,y2)
    canvas.update()
    time.sleep(0.015)

我想这不是时间安排,而是可视化不是平滑的。您是否尝试在没有可视化的情况下打印出步骤?

您试图每秒更新200次画布。似乎很多。我们看到25-60 fps的平稳运动。

更新:

我确实需要运动如此之快,甚至更快。除了更新帆布多次以外,有没有办法以不同的方式表示运动?

您仍然可以快速更改值,但是如果眼睛看不到任何差异,则不需要如此高的视觉更新。您可以尝试的是每个第10步更新帧。

,但是更好的是运行您的计算和可视化异步,因为您可能想要的是步骤之间的固定时间,无论可视化需要多长时间。

最新更新