Tkinter.after método de congelar ventana?
Tengo un cliente de chat simple con el que estaba intentando trabajarTkinter
como la interfaz. Mi problema es que al ejecutar elmainloop
con.after
para la entrada / salida de chat, la ventana se bloquea y bloquea hasta que se recibe otro mensaje.
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)
Este bloque de código se acorta, pero muestra las partes involucradas de los recursos. losEntry
El widget dejará de responder por períodos prolongados, mientras que.after
se llama y no responde hasta que se recibe un mensaje.
Cuando elEntry
el widget vuelve a responder, el campo de entrada tiene todos los datos que se ingresaron, pero no veré los cambios durante el tiempo "congelado". Lo mismo ocurre con elListbox
widget
Si alguien pudiera arrojar alguna luz sobre por qué esto es exactamente o señalar si me olvido de usar un método aquí, sería muy apreciado.
EDIT: después de un poco más de investigación, se parece a lasocket
los datos se bloquean cada vez que su llamada y la ventana se congelan durante este tiempo.