python - mtTkinter 不会终止线程

标签 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 的线程继续运行!

如有任何帮助,我们将不胜感激,在此先感谢您,抱歉我的英语不好!

最佳答案

我的应用程序 ( https://github.com/joecole889/spam-filter ) 遇到了类似的问题。经过一些调查,我意识到当我关闭我的应用程序时,Tkinter(或可能是 Matplotlib)使用 threading._DummyThread 实例来删除其中一个小部件。我的应用程序中的 Tkinter Canvas 小部件中有一个 Matplotlib 图。在任何情况下,它看起来像一个“图像删除”事件被添加到事件队列和 mtTkinter block 等待 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/

相关文章:

python - 使yfinance错误传播

python - 使用 haystack 和 Whoosh

python - 如何创建包含 256 个元素的列表?

c++ - 虚假的唤醒是否会解除阻塞所有正在等待的线程,甚至是无关的线程?

Java Server Client,线程间共享变量

python - 在 Python Tkinter 中删除标签?

python - Tkinter Canvas 缩放 + 移动/平移

python - PyGTK:在分析时,gtk.main() 花费的时间比预期更多,我如何知道这是否合理?

python - 如何在 Django 中通过 Ajax 传递 HttpResponse 和附加数据

Java:来自外部 jar 的类在线程中实例化时出现 ClassNotFoundException