在Tkinter中执行函数期间程序冻结

时间:2012-06-01 09:20:16

标签: python multithreading user-interface tkinter

我为我的一个脚本创建了一个小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分钟内能够与程序进行交互,那将非常有用。

1 个答案:

答案 0 :(得分:3)

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

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

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