当前位置: 首页 > 面试题库 >

在Tkinter中执行功能期间冻结程序

宇文航
2023-03-14
问题内容

我为我的一个脚本创建了一个小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定期调用窗口小部件的方法,但这是解决方法,而不是修复方法。

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



 类似资料:
  • 我已经为我的一个脚本创建了一个小GUI。一切进展顺利。 当我点击一个按钮时,它会启动一个大功能,解析一些网站的大量数据。 但一旦我点击了按钮,程序就会冻结,直到函数完全运行。一切正常,但为什么我的GUI在函数执行过程中会冻结。我想打印一个小进度条,但这是不可能的。 以下是该计划的一部分: 在执行模块_1期间,我无法执行/打印任何内容。main()。。。GUI完全冻结。 模块1。main()函数是一

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

  • 我正在使用一个相对较大的代码存储库,需要全部加载到Intellij中。最近Intellij挂起了很长时间( 冻结期间的Stacktrace:

  • 问题内容: 如何在不冻结程序的情况下用Java执行进程?我已经尝试过使用SwingWorker,但是我还不太了解它是如何工作的。 我还有其他方法可以做到这一点吗?我想在我的JDroidLib中使用类似的东西。有关完整的源代码,请查看GitHub:http : //github.com/Team-M4gkBeatz/JDroidLib 提前致谢! 编辑: 感谢您的回答。但是我有一个带有几种方法的类(

  • 问题内容: 我想找出在Linux上用C ++编写的函数的执行时间。我发现了很多与此有关的帖子。我尝试了此链接“ 计时器方法”中提到的所有方法来计算时间。以下是我的函数执行时间的结果: 请帮助我哪种方法读数可靠,因为所有结果的读数都不同。我读到您的操作系统正在不同的任务之间切换,因此不能期望读数非常准确。有没有一种方法可以计算CPU在功能上花费的时间。我听说过使用概要分析工具,但是还没有找到仅用于函

  • 问题内容: 我在执行后台任务时使JavaFX UI保持活动状态时遇到问题。我已经设置了这个非常简单的代码- 我希望发生的事情是让进度条每1秒钟更新一次,直到任务完成。而是,UI完全冻结10秒钟,之后进度条显示为完成。明确地说- 问题不仅在于所有更新最终一次出现,而且UI直到那时都完全没有响应。 我已经阅读了有关此主题的其他任何问题,但找不到答案。我究竟做错了什么? 谢谢。 问题答案: 使用 sta