Tkinter after()在Windows上运行缓慢
我正在开发一个程序,该程序使用firmata向Arduino发送具有一定速率/点数的点数列表。为了测试它,我使用Tkinter after()在Windows上运行缓慢,windows,multithreading,python-3.x,tkinter,Windows,Multithreading,Python 3.x,Tkinter,我正在开发一个程序,该程序使用firmata向Arduino发送具有一定速率/点数的点数列表。为了测试它,我使用tk.after()函数修改了一个程序。此外,我还有一个spinbox,可以根据需要更改速率 该程序在Windows中运行良好,默认速率为1毫秒。然而,当我将速率更改为2毫秒或其他速率时,它只能在打开Google Chrome时正确运行。否则,它会走得非常慢。 值得注意的是,当我在Macbook上运行相同的代码时,它可以很好地运行速率中的任何值 import time from tki
tk.after()
函数修改了一个程序。此外,我还有一个spinbox
,可以根据需要更改速率
该程序在Windows中运行良好,默认速率为1毫秒。然而,当我将速率更改为2毫秒或其他速率时,它只能在打开Google Chrome时正确运行。否则,它会走得非常慢。
值得注意的是,当我在Macbook上运行相同的代码时,它可以很好地运行速率中的任何值
import time
from tkinter import *
from tkinter import ttk
from timeit import default_timer as timer
root = Tk()
boxRate = IntVar()
isLooping = False
w = Label(root, text="Test")
w.pack()
frame = Frame(root, width=300, height=300)
frame.pack()
n = 0
def my_func():
global end
global start
global isLooping
global n
if n >= 359:
n = 0
end = timer()
print ("Total time: ", end - start)
start = timer()
else:
n += 1
#should be sending serial communication here
if isLooping:
root.after(boxRate.get(), my_func)
def run():
global start
global isLooping
start = timer()
isLooping = True
root.after(boxRate.get(), my_func)
def exit():
root.destroy()
def update():
print ("Update")
def print_rate(rate):
print (rate)
def stop():
global isLooping
isLooping = False
frequencyBox = Spinbox(root, from_ = 1, to = 100, textvariable = boxRate)
frequencyBox.pack()
frequencyBox.bind("<Return>", lambda event:print_rate(boxRate.get()))
runButton = ttk.Button(root, text = "Run", command = run)
runButton.pack()
updateButton = ttk.Button(root, text = "Update", command = lambda:print_rate(boxRate.get()))
updateButton.pack()
stopButton = ttk.Button(root, text = "Stop", command = stop)
stopButton.pack()
exitButton = ttk.Button(root, text = "Exit", command = exit)
exitButton.pack()
root.mainloop()
导入时间
从tkinter进口*
从tkinter导入ttk
从timeit导入默认\u计时器作为计时器
root=Tk()
boxRate=IntVar()
isLooping=False
w=标签(根,text=“测试”)
w、 包()
框架=框架(根,宽度=300,高度=300)
frame.pack()
n=0
def my_func():
全球终端
全球启动
全局isLooping
全球n
如果n>=359:
n=0
结束=计时器()
打印(“总时间:”,结束-开始)
开始=计时器()
其他:
n+=1
#应该在这里发送串行通信
如果正在播放:
root.after(boxRate.get(),my_func)
def run():
全球启动
全局isLooping
开始=计时器()
isLooping=True
root.after(boxRate.get(),my_func)
def exit():
root.destroy()
def update():
打印(“更新”)
def打印速率(速率):
打印(费率)
def stop():
全局isLooping
isLooping=False
frequencyBox=Spinbox(根,从=1到=100,textvariable=boxRate)
frequencyBox.pack()
frequencyBox.bind(“,lambda事件:打印速率(boxRate.get()))
runButton=ttk.Button(root,text=“Run”,command=Run)
runButton.pack()
updateButton=ttk.Button(root,text=“Update”,command=lambda:print\u rate(boxRate.get())
updateButton.pack()
stopButton=ttk.Button(root,text=“Stop”,command=Stop)
stopButton.pack()
exitButton=ttk.Button(root,text=“Exit”,command=Exit)
exitButton.pack()
root.mainloop()
在1ms时运行~0.37s,然后在2ms时加倍,在3ms时三倍,等等time=0.37*freq
或多或少Tk.after
不能保证函数每次都以精确的Xms运行,因为发生了任何处理。以1ms的速度运行它,然后疯狂地移动窗口,你会注意到由于负载增加,它需要更多的时间。这正是我一直收到的。但是,当Chrome在Quora或Reddit这样的特定网站上打开时,无论1、2或3毫秒,速度都会恢复正常。这就是我想知道的。此外,您是否推荐一些可延迟毫秒的替代方案来解决此问题?我使用了time.sleep(),它也有同样的问题。我不明白这会对它产生什么影响,它运行时或多或少都是一致的,无论我的ms是什么。使用任务管理器再次测试,可能其他一些后台进程正在运行time.sleep
对于tkinter
Tk来说是一个很大的禁忌。after
是主要的选择。或者你可以看看哪一个可能有用。不记得它是否友好。另一件奇怪的事是它只发生在Windows机器上(我在台式机和笔记本电脑上都试过)。我在Mac上运行了相同的代码,没有发生任何错误。我一定会查的。谢谢。