Tkin中函数执行期间的程序冻结

2024-04-24 14:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我为我的一个脚本创建了一个小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分钟内与程序交互,这将非常有帮助。


Tags: 数据函数textself程序功能脚本网站
1条回答
网友
1楼 · 发布于 2024-04-24 14:34:42

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

唯一的解决方案是a)将线程用于长时间运行的命令,b)将进程用于长时间运行的命令,或c)将命令分成小块,每个小块可以在几毫秒内运行,以便在事件循环的后续迭代期间运行一个小块。还有一个解决方案是周期性地调用小部件的update_idletasks方法,但这更多的是一种解决方法,而不是修复方法。

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

相关问题 更多 >