编写了一个函数,该功能将左右移动到循环中的边缘。我希望它会以恒定的速度移动。实际发生的是运动很粗糙。运动将改变其速度。如何使其以恒定的速度移动?
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步更新帧。
,但是更好的是运行您的计算和可视化异步,因为您可能想要的是步骤之间的固定时间,无论可视化需要多长时间。