I have a simple chat client that I'm trying to work with Tkinter as an interface. My problem is that when I start mainloop with .after for chat I / O, the window freezes and locks until another message is received.
class Client(Frame): def __init__(self, **kwargs): 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('<Return>', 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): 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_handle)
This code block is abbreviated, but shows the parts involved. The Entry widget will stop responding for long periods of time until .after is called and will not respond until a message is received.
When the Entry widget reacts again, the input field has all the data that has been entered, but I will not see the changes during the "frozen" time. The same goes for the Listbox widget.
If someone can shed some light on why this is accurate or indicate if I skipped a method, it would be very helpful here.
EDIT: after several studies, its appearance, similar to socket data, is blocked whenever its callers and windows freeze during this time.
source share