2016-09-14 103 views
0

我搜索了這個網站(和其他人)上下,但我似乎無法找到正確的解決方案。Tkinter Threading導致UI凍結

我有一個客戶端程序,連接到服務器,並自動發送消息,每隔幾秒,以及用戶命令。我爲此使用了多個線程。 輸入Tkinter:一旦我點擊「連接」按鈕,我的用戶界面就會凍結,直到連接嘗試超時或直到時間結束,客戶端纔會連接到服務器。

我試着從按鈕的命令參數,從主循環內,以及主循環外調用線程。我試着把主循環放在一個線程中,然後從那裏爲連接創建一個新的線程。 似乎沒有任何工作... UI繼續掛起。

class EventSim(Frame): 

    def __init__(self, parent): 
     self.queue = Queue 
     Frame.__init__(self, parent) 

     self.parent = parent 

    def initUI(self,IP_Address,Port_Number,Events_Directory): 
    #... 
    self.Con_Button = Button(frame7,text='Connect', command = lambda: 
     self.connect(IP_Text.get(),Port_Text.get(),)) 

    def connect(self,IP,Port): 
     ConnectionThread = Thread(eventsim.con_thread(IP,Port)) 
     ConnectionThread.start() 


def main(): 
root = Tk() 
root.geometry("300x310+750+300") 
Sim = EventSim(root) 
eventsim.readconfig() 
Sim.initUI(eventsim.ipa,eventsim.portnum,eventsim.event_dir) 
root.mainloop() 
+0

所有Tkinter的互動需要在一個單獨的線程。你不能可靠地從除根創建窗口以外的任何線程調用tkinter對象上的tkinter函數或方法。 –

回答

1

您傳遞的eventsim.con_thread(IP,Port)的結果Thread(...)功能,所以它會等到eventsim.con_thread(...)完成執行。嘗試改變:

def connect(self, IP, Port): 
    ConnectionThread = Thread(eventsim.con_thread(IP,Port)) 
    ConnectionThread.start() 

到:

def connect(self, IP, Port): 
    ConnectionThread = Thread(target=lambda ip=IP, port=Port: eventsim.con_thread(ip,port)) 
    ConnectionThread.start() 
+0

這就像一個魅力。非常感謝。我昨天花了幾個小時試圖弄清楚。我實際上嘗試了lambda方法,但是像這樣: ConnectionThread = Thread(target = lambda:eventsim.con_thread(IP,Port)) 我猜這仍然犯了同樣的錯誤。 –