2012-12-28 162 views
3

我需要運行在一個Tkinter的GUI多線程一些簡單的功能,所以我試圖mtTkinter.mtTkinter不會終止線程

一切正常,除了特定的罰款:即使我剛開始的GUI然後關閉它而不觸及任何線程繼續運行。

換句話說;我有這樣的代碼:

from Tkinter import * 
root = Tk() 

#simple GUI code with buttons, labels, text and scrollbars widget 
... 
...  
root.mainloop() 

如果我運行這段代碼的GUI出現,當我關閉這個python腳本成功結束。

現在,如果我mtTkinter

from mtTkinter import * 
root = Tk() 

#simple GUI code with buttons, labels, text and scrollbars widget 
... 
...  
root.mainloop() 

更換Tkinter的GUI中再次出現,但如果我關閉它仍然有來自mtTkinter一些線程保持運行!

任何幫助將被認可,預先感謝你,併爲我的英語不好!

+0

您可以執行多線程函數,只需使用創建Tcl解釋器的線程來更新Tk的GUI元素(這代表所有主要的GUI工具包)。 mtTkinter不應該被使用。如果您需要進一步幫助,請包括您擁有的實際代碼。 – mmgp

+0

非常醜陋的解決方法:os._exit(0) – Gonzo

+0

@mmgp:你將如何啓動主循環非阻塞? – Gonzo

回答

1

我已經「解決」不使用它。 mTkinter似乎有點錯誤。

+0

除了你在這裏問過的那個人之外,我從來沒有遇到任何問題。 – Gonzo

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) : 

事情似乎是現在的工作對我來說...希望這有助於!

+0

這應該是解決方案,完美的作品! – willpower2727

0

這是一個老話題,但我看不到它甚至關閉了。我有一個使用4個線程的python應用程序,使用'theading'模塊和MtTkinter。

我和MtTkinter有類似的問題。該應用程序工作但不會關閉。我已經搜索並嘗試了很多解決方案,但都沒有成功。對於我的應用程序來說,使用隊列將是一件苦差事。

這是我做的。它不優雅,但它的工作。它非常無情。

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

第一行故意冒號後的反撥號是什麼意思? – lit