Python Tkinter After循环仅在鼠标移动时运行到时间

Python Tkinter After循环仅在鼠标移动时运行到时间,python,tkinter,Python,Tkinter,我将after()用于Tkinter动画循环: 从tkinter导入Tk,画布 从时间导入时间 root=Tk() root.configure(宽度=1920,高度=1080) 根目录。可调整大小(True,True) 主=画布(根,宽=1600,高=900) ball=main。创建_椭圆(80、80、120、120,fill=“#FF0000”) main.pack() frametarget=17 lasttime=时间() 帧时间=[] def move(): 全球上次 追加(time

我将after()用于Tkinter动画循环:

从tkinter导入Tk,画布
从时间导入时间
root=Tk()
root.configure(宽度=1920,高度=1080)
根目录。可调整大小(True,True)
主=画布(根,宽=1600,高=900)
ball=main。创建_椭圆(80、80、120、120,fill=“#FF0000”)
main.pack()
frametarget=17
lasttime=时间()
帧时间=[]
def move():
全球上次
追加(time()-lasttime)
lasttime=时间()
主。移动(球,1,1)
root.after(帧目标,移动)
root.after(0,移动)
root.mainloop()
打印(总和(帧时间[60:])/len(帧时间[60:])*1000)
这通常似乎在约30毫秒的范围内更新,无人看管时视觉上看起来很慢,但当鼠标持续在窗口上移动时,它会持续地点击17毫秒,运行平稳,但一旦停止,就会返回

我使用的是Python 3.7和Windows 10

测试:

frametarget=17时的平均帧时间(约60fps)

不移动鼠标=29.28ms
鼠标移动=17.08毫秒
frametarget=50时的平均帧时间(对于20fps)

不移动鼠标=62.50ms
鼠标移动=50.04ms
更新: Linux上不存在相同的问题。

升级到Python 3.8.6(从3.7.4版)解决了这个问题


这似乎是我自己的环境所独有的,因为这个问题没有在OSX、Linux或其他Windows环境中重现。

您需要显示一个以获得任何特定帮助。一般来说,除非您使用的是Windows XP,否则我想不出发生这种情况的任何原因。这两个更新行是不需要的-删除它们,看看是否有帮助。请注意,到目前为止,瓶颈将是绘图到屏幕的步骤,我通常不指望任何超过25毫秒的速度,逻辑很少考虑在内。此外,标准显示器是30赫兹,因此任何超过33毫秒的速度都不会对用户造成影响。@Novel我更新了一个更好的例子,并进行了一些测试。即使以较低的帧速率运行,鼠标移动与否之间也存在相同的差异,问题更多的是不一致导致动画在不同点上显示得较慢/较快,而不是帧速率本身。当我运行(更新)在你的问题中输入代码,并且没有鼠标在窗口上不停地移动,我的计时一直非常接近
17
。很有趣,谢谢你的代码。你是怎么运作的?当我尝试你的代码时,它非常准确,并将设置的帧速率降低到1毫秒。移动鼠标没有任何区别。您使用的是什么操作系统、python版本、环境?@novelpython3.7、Windows10。我尝试过通过IDE和直接从cmd运行,得到了相同的结果,但并不是说这会有什么不同。我将尝试在Linux和其他PC上进行测试,看看是否会出现相同的结果,尽管这对于确保它在Windows上工作是必要的。值得注意的是,感谢更新。