我有一个简单的聊天客户端,我试图将其Tkinter
用作界面。我的问题是,在为聊天输入/输出运行mainloop
with时.after
,窗口会冻结并阻塞,直到收到另一条消息。
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)
此代码块已缩短,但显示了所涉及的相关部分。小Entry
部件将在被调用时长时间无响应,.after
并且在收到消息之前不会响应。
当Entry
小部件再次响应时,输入字段包含输入的所有数据,但是在“冻结”期间我不会看到更改。小部件也是如此Listbox
。
如果有人能阐明为什么会这样,或者指出我是否错过了在这里使用一种方法,将不胜感激。
编辑:经过更多研究,socket
在这段时间里,每当它被调用并且窗口被冻结时,它看起来就像数据被阻塞。