我为我的一个脚本创建了一个小GUI。一切都很好。
当我单击一个按钮时,它会启动一个很大的功能,该功能正在解析某些网站中的许多数据。
但是,一旦我单击了Button,程序就会冻结,直到该功能完全运行为止。一切正常,但是为什么我的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()时,我无法执行任何操作//打印任何内容… GUI完全冻结。
Module_1.main()函数是一个线程解析器(解析来自两个网站的某些数据),通常需要2分钟才能运行。如果某人有想法可以在执行此功能所需的2分钟内与程序进行交互,则将非常有帮助。
Tkinter是单线程的。屏幕更新在整个事件循环中每次旅行时发生。每当您使用长时间运行的命令时,都在阻止事件循环完成迭代,从而阻止了事件的处理,从而阻止了重绘。
唯一的解决方案是:a)对长时间运行的命令使用线程,b)对长时间运行的命令使用进程,或者c)将命令分解为小块,每个小块可以在几毫秒内运行,因此您可以运行一个事件循环的后续迭代中的块。您还有另一种解决方案,该解决方案是update_idletasks定期调用窗口小部件的方法,但这是解决方法,而不是修复方法。
update_idletasks
请记住,Tkinter不是线程安全的,因此使用线程需要格外小心。您只能从主线程调用窗口小部件上的方法,这意味着其他线程必须通过线程安全队列与主线程进行通信。