我正在修复一个GUI长时间冻结的应用程序,而该应用程序确实在工作。我已经能够通过使用两个线程(GUI /主线程和“计算”线程)来解冻它。这提供了我所需的信息,但是,每次计算线程终止时,上述错误都会显示给最终用户 。
解决此消息的根本原因(不可避免的双关语)的正确/规范方法是什么?(请注意,交付中不接受诸如重定向stderr之类的麻烦)。 >
我查看了许多有关解决冻结问题的方法(超过100个问题)和多个站点。我还阅读了许多搜索该邮件时获得的热门信息。结果,我现在很困惑。我从这里去哪里?
以下是我已经完成并尝试过的细节。
通过用以下三行替换对“ DoCalculation”的调用,将“计算”移入了自己的“即发即弃”线程:
from multiprocessing.dummy import Process
DoCalculationProcess = Process( target = DoCalculation
DoCalculationProcess.start()
故意没有.join()行并防止GUI冻结。
除了启动顶级“完成”窗口(作为根/主窗口的子窗口)之外,计算线程不会与GUI交互。所有计算完成后,就会发生这种情况。
该应用程序按预期方式运行,但错误消息的良性(但令人震惊)的存在直到计算线程退出时才会引发。 (顺便说一句,错误在“ Calculate.mainloop()”行中标记。)
从几个问题(例如Brian Oakleys对Tkinter generate and invoke virtual event between different widgets的回答)中,我知道要消除错误,需要:
为此,我尝试使用tkinter虚拟事件:(http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/virtual-events.html),方法是在应用程序的根窗口的创建位置之后添加这两行:
import Finished # the "Done window, a Toplevel child of "root"
root.bind( '<<CalculationDone>>', Finished.FinishedWindow ( root, # then 3 other parameters )
,此行位于(新)DoCalculation thead的末尾,就在它退出之前:
root.event_add( '<<CalculationDone>>' ) # needs to be an unconditional call
该代码仍会产生预期的结果,但是此更改并未消除导致消息的原因。
一小部分相关页面的抽样,没有特别的顺序,我认为是有帮助的:
"RuntimeError: Calling Tcl from different appartment" tkinter and threading
tkinter error on python 3 (RuntimeError: Calling Tcl from different appartment)
How to use threading in Python?
How do you run your own code alongside Tkinter's event loop?
我从这里去哪里?