5

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

任何帮助将不胜感激,提前谢谢你,对不起我的英语不好!

4

3 回答 3

3

我的应用程序(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) :

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

于 2016-03-17T20:29:24.787 回答
2

我已经“解决”了不使用它。mTkinter 似乎有点问题。

于 2013-01-18T23:54:02.157 回答
0

这是一个老话题,但我看不出它在哪里被关闭了。我有一个使用 'theading' 模块和 MtTkinter 的 4 个线程的 python 应用程序。

我在使用 MtTkinter 时遇到了类似的问题。该应用程序工作但不会关闭。我已经搜索并尝试了很多解决方案,但都没有奏效。对于我的应用程序,使用队列将是一件苦差事。

这就是我所做的。它并不优雅,但它确实有效。它相当无情。

cleanup():`
    pidx = os.getpid()
    cmd1 = "kill" + " " + str(pidx)
    if __name__ == "__main__":
        os.system(cmd1)
于 2016-05-09T19:22:44.203 回答