【问题标题】:mtTkinter doesn't terminate threadsmtTkinter 不会终止线程
【发布时间】:2012-12-28 17:39:46
【问题描述】:

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

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

【问题讨论】:

  • 你可以做多线程功能,只需使用创建 Tcl 解释器的线程来更新 Tk 的 GUI 元素(这代表所有主要的 GUI 工具包)。不应该使用 mtTkinter。如果您需要进一步的帮助,请提供您拥有的实际代码。
  • 非常难看的解决方法:os._exit(0)
  • @mmgp:你将如何启动非阻塞主循环?
  • 你不会非阻塞地启动它。
  • 您是否设置了守护进程标志? stackoverflow.com/questions/4330111/…

标签: python multithreading tkinter


【解决方案1】:

我的应用程序遇到了类似的问题 (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) :

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 除了你在这里问的这个问题之外,我从来没有遇到过任何问题。
    【解决方案3】:

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

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

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

    cleanup():`
        pidx = os.getpid()
        cmd1 = "kill" + " " + str(pidx)
        if __name__ == "__main__":
            os.system(cmd1)
    

    【讨论】:

    • 第一行冒号后面的反引号是故意的吗?
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2012-08-28
    • 2021-09-05
    • 1970-01-01
    • 2017-12-15
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多