当前位置: 首页 > 知识库问答 >
问题:

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

卫建义
2023-03-14

我已经为我的一个脚本创建了一个小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")

在执行模块_1期间,我无法执行/打印任何内容。main()。。。GUI完全冻结。

模块1。main()函数是一个线程解析器(解析来自两个网站的一些数据),运行它通常需要2分钟。如果有人想在执行此功能所需的2分钟内与程序交互,这将非常有帮助。

共有1个答案

麹学文
2023-03-14

Tkinter是单Thread的。通过事件循环的每次行程都会发生屏幕更新。任何时候,只要有一个长时间运行的命令,就会阻止事件循环完成迭代,从而阻止事件的处理,从而防止重画。

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

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

 类似资料:
  • 问题内容: 我为我的一个脚本创建了一个小GUI。一切都很好。 当我单击一个按钮时,它会启动一个很大的功能,该功能正在解析某些网站中的许多数据。 但是,一旦我单击了Button,程序就会冻结,直到该功能完全运行为止。一切正常,但是为什么我的GUI在执行功能时冻结了。我想打印一个进度条,但这是不可能的。 这是程序的一部分: 在执行Module_1.main()时,我无法执行任何操作//打印任何内容…

  • 问题内容: 这是GUI编程中的新功能,我正在尝试为我的python解析器之一创建GUI。 我知道 : Tkinter是单线程的。屏幕更新在整个事件循环中每次旅行时发生。每当您使用长时间运行的命令时,都在阻止事件循环完成迭代,从而阻止了事件的处理,从而阻止了重绘。 我的程序调用了一个大函数,大约需要5分钟才能完全运行它。因此,我猜唯一的解决方案是针对长期运行的命令使用线程。但是,我长期运行的命令已经

  • 所以,我的问题是,我正在尝试为我的应用程序进行单元测试。我有两个服务,我们叫它们Foo和Bar,Foo只是Bar的代理。 因此,Foo服务的路由器如下所示: 向Bar服务发出请求的处理程序如下所示: 当我这样写测试时: 它永远冻结了......嗯,我想这是因为它周围的一些协程魔法,但是因为我在这方面还是新手,我不明白这里到底发生了什么。有什么帮助吗?

  • 问题内容: 我试图弄清楚控制流程是如何工作的。 我想显示一个矩形并使它闪烁三下。我写了这段代码,但是没有用。我猜这是因为在之前执行了,实际上并没有画任何东西。如果是这样,我怎么能交换的控制流程,并mainloop使其工作? 我的代码: 问题答案: 事件驱动的编程需要不同于过程代码的思维方式。你的应用程序正在无限循环中运行,将事件从队列中拉出并进行处理。要制作动画,你需要做的就是在适当的时间将项目放

  • 问题内容: 我有一个永远不会更新的问题。第一次查询时它会正确报告,然后当我使用键盘更改状态时,更改不会反映出来。 这是设计使然(在API文档中似乎不是这样),错误还是我的代码有问题? 这是一个简短的自包含示例,用于演示此问题: 在运行Windows的Java机器上,使用Java 1.7.0_45时,它会打印或根据num lock键的初始状态进行打印,但是在切换按钮时,不会像我期望的那样混合打印。

  • 我想知道在我的C程序中,某个函数在Linux上执行需要多少时间。之后,我想做一个速度比较。我看到了几个时间函数,但最后从boost得到了这个结果。计时: 现在,我不清楚如果我使用上述功能,我会得到CPU在该功能上花费的唯一时间吗? 其次,我找不到任何使用上述功能的例子。请帮助我如何使用上述功能? P.S:现在,我正在使用以秒为单位获取时间,但由于每次CPU负载不同,这给了我不同的结果。