Tkinter .after method freezing window?

前端 未结 2 1002
日久生厌
日久生厌 2021-01-03 02:03

I have a simple chat client that I was attempting to get working with Tkinter as the interface. My problem is that when running the mainloop with

2条回答
  •  生来不讨喜
    2021-01-03 02:32

    I learned about using select to make system calls to check if a socket file is ready to be read.

    How to set timeout on python's socket recv method?

    class Client(Frame):
    
        def __init__(self, **kwargs):
            self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.client.connect(("host", port))
            self.client.setblocking(0)
            Frame.__init__(self, Tk())
            self.pack()
    
            self.lb = Listbox(self, width=100, height=30)
            self.lb.pack()
    
            self.show_data = self.lb.after(1000, self.chat_handle)
    
            self.entry = Entry(self)
            self.entry.bind('', self.input_handle)
            self.entry.pack(side=BOTTOM, fill=X)
    
        def input_handle(self, event):
            msg = self.entry.get()
            self.entry.delete(0, 'end')
            new_msg = 'privmsg %s :' % self.channel + msg + '\r\n'
            self.client.sendall(new_msg)
            self.lb.insert(END, self.nick + ' | ' + msg)
    
        def chat_handle(self):
            socket_data = select.select([self.client], [], [], 0.3) # set timeout on last arg
            if socket_data[0]:
                try:
                    self.data = self.client.recvfrom(1024)
                except socket.error:
                    self.lb.insert(END, "Bad Connection!")
                    return
                if self.data and len(self.data[0]) > 0:
                    self.lb.insert(END, self.data[0])
                elif self.data and len(self.data[0]) == 0:
                    self.lb.insert(END, "Connection Dropped!")
                    return
                self.show_data = self.lb.after(1000, self.chat_hand
    

提交回复
热议问题