インターフェイスとして使用しようとしていた単純なチャット クライアントが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
データが呼び出されるたびにデータがブロックされ、この間にウィンドウがフリーズしているように見えます。