Я пишу программу чата с пользовательским интерфейсом.Часть, где у меня проблема - это функция on_closing, которую я написал для пользователей, которые нажимают кнопку «X» в углу.Когда пользователь закрывает соединение таким способом, клиент отправляет серверу предварительно определенную нотацию, и сервис соответствующим образом обрабатывает ситуацию, удаляя этого клиента из словаря, в котором хранятся клиенты.Однако, когда я нажимаю кнопку X на стороне клиента, пользовательский интерфейс зависает, и я не могу разобраться, почему.Код клиента ниже:
import socket
import sys
from threading import Thread
import tkinter
HOST=socket.gethostbyname(socket.gethostname())
PORT=5000
top = tkinter.Tk()
top.state("zoomed")
top.title("RChat")
messages_frame = tkinter.Frame(top)
my_msg = tkinter.StringVar()
my_msg.set("Type your messages here")
scrollbar = tkinter.Scrollbar(messages_frame)
msg_list = tkinter.Listbox(messages_frame, height=37, width=200,
yscrollcommand=scrollbar.set)
scrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
msg_list.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
msg_list.pack()
messages_frame.pack()
def recv():
while True:
data = s.recv(1024)
if not data: sys.exit(0)
msg_list.insert(tkinter.END, data.decode())
def send(event=None):
message = entry_field.get("1.0", "end-1c")
s.send(message.encode('utf-8'))
entry_field.delete('1.0', tkinter.END)
return "break"
def shuffle(event=None):
s.send("?pRG=gmxHD74cEm".encode("utf-8"))
def on_closing(event=None):
s.send("4t7w!z%C".encode("utf-8"))
try:
s = socket.socket()
s.connect((HOST,PORT))
except ConnectionRefusedError:
msg_list.insert(tkinter.END, "The server is not connected.")
entry_field = tkinter.Text(top, height=5, width=150)
entry_field.bind("<Return>", send)
entry_field.place(x=72, y=600)
send_button = tkinter.Button(top, text="Send", command=send, height=2,
width=20)
send_button.pack()
send_button.place(x=1150, y=600)
shuffle_button = tkinter.Button(top, text="Shuffle", command=shuffle,
height=2, width=20)
shuffle_button.pack()
shuffle_button.place(x=1150, y=650)
top.protocol("WM_DELETE_WINDOW", on_closing)
t1=Thread(target=recv)
t1.start()
tkinter.mainloop()