2011-08-10 256 views
1

我使用Tkinter窗口來可視化我的程序的一些輸出。該窗口是螺紋(見下面的基本結構),基本上它工作得很好。到目前爲止,我在關閉窗口方面遇到困難。當我點擊「X」按鈕關閉它的窗口時,它就起作用了。但是,當我從啓動監視器線程的主程序中調用Monitor.close()方法時,窗口會凍結(例如,它不會在單擊「X」按鈕時發生反應),並且線程監視器繼續運行。因此,主程序不會退出。關閉線程Tkinter窗口

因此,目前,我還必須先點擊關閉按鈕然後點擊主程序,然後「手動」關閉窗口。這不是一個大問題,但如果主程序可以自行關閉窗口,那將會很棒。任何提示?

感謝和問候,

基督教

class Monitor(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self.start() 

    def close(self): 
     self.root.quit() 
     self.root.destroy() 

    def run(self): 
     self.root=Tkinter.Tk() 
     self.root.protocol("WM_DELETE_WINDOW", self.close) 
     self.root.mainloop() 

回答

2

Python的線程,並以這種方式使用不拌勻,TK(間),因爲它們違反僅僅使用傳統知識的Tcl/Tk的線程模型來自一個線程。

它很適合消息傳遞,但不是直接從線程調用。所以你需要添加一些消息通過隊列傳遞給這個。

查看示例中的http://effbot.org/zone/tkinter-threads.htm

+0

謝謝你的回答,我會ee到的!對我來說,一切都很有趣,例如,從主程序中調用draw()方法。 – Christian

+0

線程問題與往常一樣。事情似乎工作得很好,直到他們停止這樣做,因爲你遇到了一些時間問題,競爭狀況,數據損壞或死鎖。 Tcl/Tk具有相當不錯的線程模型(基於消息傳遞,沒有共享狀態或GIL),而Python使用具有共享狀態的不同模型並像GIL那樣鎖定到處。混合這兩個可以工作,但有時不會。 – schlenk

+0

感謝您的闡述! – Christian