Tkinter线程导致UI冻结

时间:2016-09-14 20:52:20

标签: python multithreading tkinter

我上下搜索过这个网站(和其他网站),但我似乎无法找到合适的解决方案。

我有一个客户端程序连接到服务器并每隔几秒自动发送一条消息,以及用户命令。我正在使用多个线程。 输入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()

1 个答案:

答案 0 :(得分:2)

您将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()