mtTkinter无法终止线程。

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的一些线程在运行!

任何帮助都将不胜感激,提前致谢,并为我的糟糕英语向您道歉!


你可以使用Tcl解释器创建的线程来更新Tk GUI元素(这适用于所有主要的GUI工具包),从而实现多线程功能。不建议使用mtTkinter。如果需要进一步帮助,请附上您实际拥有的代码。 - mmgp
非常丑陋的解决方法:os._exit(0) - Gonzo
@mmgp:你会如何启动非阻塞的主循环? - Gonzo
你没有以非阻塞方式启动它。 - mmgp
你设置了守护进程标志吗?https://dev59.com/7G855IYBdhLWcg3wc0Dy - Gonzo
是的,使用mTkinter没有结果。 - user1726963
3个回答

3
我遇到了一个类似的问题,是关于我的应用程序(https://github.com/joecole889/spam-filter)的。经过一些调查,我发现当我关闭我的应用程序时,Tkinter(或可能是Matplotlib)使用一个threading._DummyThread实例来删除其中一个小部件。我的应用程序中有一个在Tkinter画布小部件中的Matplotlib图形。无论如何,看起来像是添加了一个“图像删除”事件到事件队列中,而mtTkinter则阻塞等待从未到来的响应Queue。

我通过允许来自threading._DummyThread实例的事件运行而不通过mtTkinter的队列基础设施来解决了这个问题。也就是说,我改变了:

if threading.currentThread() == self._tk._creationThread:

if (threading.currentThread() == self._tk._creationThread) or \
   isinstance(threading.currentThread(), threading._DummyThread) :

现在对我来说似乎一切正常...希望这能帮到你!


2

我决定不使用它。mTkinter 似乎有点故障。


除了你在这里问的这个问题,我从来没有遇到过任何问题。 - Gonzo

0

这是一个旧话题,但我甚至没有看到它被关闭的地方。我有一个使用“theading”模块和MtTkinter的Python应用程序,使用4个线程。

我曾经遇到过与MtTkinter类似的问题。应用程序可以工作,但无法关闭。我搜索并尝试了很多解决方案,但都没有奏效。对于我的应用程序,使用队列将是一项艰巨的任务。

这是我所做的。它不太优雅,但它起作用了。它相当无情。

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

第一行冒号后面的反引号是有意为之吗? - lit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接