Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tkinter after()在Windows上运行缓慢_Windows_Multithreading_Python 3.x_Tkinter - Fatal编程技术网

Tkinter after()在Windows上运行缓慢

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

我正在开发一个程序,该程序使用firmata向Arduino发送具有一定速率/点数的点数列表。为了测试它,我使用
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上运行了相同的代码,没有发生任何错误。我一定会查的。谢谢。