我需要使用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的线程继续运行!
任何帮助都会得到赞赏,提前谢谢你,抱歉我的英语不好!
答案 0 :(得分:2)
我的应用程序遇到了类似的问题(https://github.com/joecole889/spam-filter)。经过一些调查,我意识到当我关闭我的应用程序时,Tkinter(或可能是Matplotlib)使用threading._DummyThread实例来删除其中一个小部件。我的应用程序中的Tkinter画布小部件中有一个Matplotlib图。在任何情况下,它看起来像是一个“图像删除”事件被添加到事件队列中,而mtTkinter块则等待对从未来的responseQueue的响应。
我能够通过允许来自threading._DummyThread实例的事件在不通过mtTkinter的队列基础结构的情况下运行来解决问题。也就是说,我改变了:
if threading.currentThread() == self._tk._creationThread:
到
if (threading.currentThread() == self._tk._creationThread) or \
isinstance(threading.currentThread(), threading._DummyThread) :
现在似乎对我有用......希望这有帮助!
答案 1 :(得分:1)
我已“解决”不使用它。 mTkinter似乎有点儿麻烦。
答案 2 :(得分:0)
这是一个老话题,但我看不到它甚至关闭的地方。我有一个使用'theading'模块和MtTkinter的4个线程的python应用程序。
我遇到了与MtTkinter类似的问题。该应用程序工作但不会关闭。我搜索并尝试了很多解决方案,没有一个工作。对于我的应用程序,使用队列本来是一件苦差事。
这就是我所做的。它不优雅,但它的工作原理。它非常无情。
cleanup():`
pidx = os.getpid()
cmd1 = "kill" + " " + str(pidx)
if __name__ == "__main__":
os.system(cmd1)