2016-09-14 106 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)) 我猜这仍然犯了同样的错误。 –