我为我的一个脚本创建了一个小GUI。一切正常。
当我点击一个按钮时,它会启动一个大函数,解析来自一些网站的大量数据。
但一旦我点击了按钮,程序就会冻结,直到功能完全运行。一切正常,但为什么我的GUI在执行函数时会冻结。 我想打印一个进度条,但不可能。
以下是计划的一部分:
self.Button1 = Button(self.MENU, text="IELTS", command=self.My_Command)
self.Button1.grid(row=0, column=0,sticky=W+E)
def My_Command(self):
## HERE WE LAUNCH THE FUNCTION
Module_1.main() # My Big Function from another file
self.Button1.config(text="DONE")
在执行Module_1.main()期间,我无法执行/打印任何操作。。。图形用户界面完全冻结。
Module_1.main()函数是一个线程解析器(解析来自两个网站的一些数据),运行通常需要2分钟。如果有人想在执行此函数所需的2分钟内与程序交互,这将非常有帮助。
Tkinter是单螺纹的。每次通过事件循环的行程都会发生屏幕更新。每当您有一个长时间运行的命令时,您将阻止事件循环完成迭代,从而阻止事件的处理,从而防止重绘。
唯一的解决方案是a)将线程用于长时间运行的命令,b)将进程用于长时间运行的命令,或c)将命令分成小块,每个小块可以在几毫秒内运行,以便在事件循环的后续迭代期间运行一个小块。还有一个解决方案是周期性地调用小部件的
update_idletasks
方法,但这更多的是一种解决方法,而不是修复方法。记住Tkinter不是线程安全的,所以使用线程需要格外小心。您只能从主线程调用小部件上的方法,这意味着其他线程必须通过线程安全队列与主线程通信。
相关问题 更多 >
编程相关推荐