mtTkinter不终止线程

时间:2012-12-28 17:39:47

标签: python multithreading tkinter

我需要使用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的线程继续运行!

任何帮助都会得到赞赏,提前谢谢你,抱歉我的英语不好!

3 个答案:

答案 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)