我需要使用Tkinter GUI在多线程中运行一些简单的函数,因此我尝试了mtTkinter.

除了特定的功能外,其他所有功能都可以正常工作:即使我只是启动GUI,然后关闭它,也没有碰到任何线程,这使得它一直在运行。

换句话说;我有以下代码:

from Tkinter import *
root = Tk()

#simple GUI code with buttons, labels, text and scrollbars widget
...
...
root.mainloop()

如果我运行此代码,则会显示GUI,当我关闭它时,此python脚本将成功结束。

现在,如果我用mtTkinter替换Tkinter
from mtTkinter import *
root = Tk()

#simple GUI code with buttons, labels, text and scrollbars widget
...
...
root.mainloop()

GUI再次出现,但是如果我关闭它,仍然有来自mtTkinter的线程继续运行!

我们将不胜感激,在此先感谢您,我的英语不好!

最佳答案

我的应用程序(https://github.com/joecole889/spam-filter)遇到了类似的问题。经过一番调查,我意识到当我关闭应用程序时,Tkinter(或可能的Matplotlib)使用threading._DummyThread实例删除其中一个小部件。我的应用程序的Tkinter Canvas 小部件中有一个Matplotlib图。无论如何,它似乎都将“图像删除”事件添加到事件队列中,并且mtTkinter块等待对responseQueue的响应永远不会出现。

我能够通过运行来自threading._DummyThread实例的事件而无需通过mtTkinter的队列基础结构来解决此问题。也就是说,我更改了:

if threading.currentThread() == self._tk._creationThread:


if (threading.currentThread() == self._tk._creationThread) or \
   isinstance(threading.currentThread(), threading._DummyThread) :

事情现在似乎对我有用...希望这会有所帮助!

关于python - mtTkinter不会终止线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14073463/

10-11 05:01