8

我为我的一个脚本创建了一个小 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() 期间我不能做/打印任何事情...... GUI 完全冻结了。

Module_1.main() 函数是一个线程解析器(解析来自两个网站的一些数据),运行时间一般为 2 分钟。如果有人想在执行此功能所需的 2 分钟内与程序进行交互,那将非常有帮助。

4

1 回答 1

6

Tkinter 是单线程的。屏幕更新发生在事件循环的每次行程中。每当您有一个长时间运行的命令时,您都会阻止事件循环完成迭代,从而阻止事件的处理,从而阻止重绘。

您唯一的解决方案是 a) 为长时间运行的命令使用线程,b) 为长时间运行的命令使用进程,或 c) 将命令分成小块,每个小块都可以在几毫秒内运行,这样您就可以运行一个事件循环的后续迭代中的块。您还有另一种解决方案,即update_idletasks定期调用小部件的方法,但这更像是一种解决方法而不是修复。

请记住,Tkinter 不是线程安全的,因此使用线程需要格外小心。您只能从主线程调用小部件上的方法,这意味着其他线程必须通过线程安全队列与主线程通信。

于 2012-06-01T10:55:38.043 回答