Python tkinter更新函数冻结主函数
我有一个带有python API的windows应用程序(支持python 3)。您可以提供一个具有main函数的类。在程序启动时,将创建此类的实例,并定期调用main函数。我可以配置频率,但没有其他功能。(我不能改变API的工作方式) 现在,我想使用tkinter进行一些可视化、图表等。以下是我当前班级结构的一个示例:Python tkinter更新函数冻结主函数,python,python-3.x,tkinter,python-multithreading,Python,Python 3.x,Tkinter,Python Multithreading,我有一个带有python API的windows应用程序(支持python 3)。您可以提供一个具有main函数的类。在程序启动时,将创建此类的实例,并定期调用main函数。我可以配置频率,但没有其他功能。(我不能改变API的工作方式) 现在,我想使用tkinter进行一些可视化、图表等。以下是我当前班级结构的一个示例: import tkinter as tk class Script: def __init__(self): self.root = tk.Tk()
import tkinter as tk
class Script:
def __init__(self):
self.root = tk.Tk()
self.count = 0
def main(self):
# do some stuff
print(str(self.count))
self.count += 1
# update gui
self.root.update()
# This is to simulate the software behavior.
import time
scriptInstance = Script()
for i in range(0, 20 * 10):
scriptInstance.main()
time.sleep(0.1)
我遇到的主要问题是,只要与Tkinter交互,root.update()方法就会冻结主函数。通过上面的示例,您可以看到,只要您移动窗口,数字就不会计数。有没有办法防止这种情况发生
我试图从另一个线程调用root.update(),但由于Tkinter不允许这样做,因此该线程不起作用
谢谢您的帮助。尝试了
after()
方法?是的,我厌倦了self.root.after(1,self.root.update)
而不是直接调用self.root.update()
。但它不起作用。Gui更新未发生,窗口未出现。在其他示例中,总是使用after()
来运行其他代码,然后调用tkinter mainloop或update。这在我的例子中不起作用,因为API期望主函数返回。我做了一些更改并添加了一个答案,请注意,(1,func)之后只等待一微秒。你的意思是在(1000,func)之后吗?我不需要延迟(并且增加数字不会改变结果)。想法是继续使用main()
-方法,并让self.root.update()
由after()触发。但是,我想您需要调用update()
来处理after()
mehod。(鸡蛋困境)尝试了after()
方法?是的,我厌倦了self.root.after(1,self.root.update)
而不是直接调用self.root.update()
。但它不起作用。Gui更新未发生,窗口未出现。在其他示例中,总是使用after()
来运行其他代码,然后调用tkinter mainloop或update。这在我的例子中不起作用,因为API期望主函数返回。我做了一些更改并添加了一个答案,请注意,(1,func)之后只等待一微秒。你的意思是在(1000,func)之后吗?我不需要延迟(并且增加数字不会改变结果)。想法是继续使用main()
-方法,并让self.root.update()
由after()触发。但是,我想您需要调用update()
来处理after()
mehod。(鸡蛋两难)