嘿,我正在尝试用 python 创建聊天,除了我的目标是同时启动我的图形界面和我的功能
chat_page
,还有我的功能允许读取我在服务器上的数据reicive_message
,我尝试使用线程,但出现错误
File "e:\NSI\pychat\tkclient.py", line 27, in <lambda> btn_connect = Button(home_fen,text="Connecter",width=15, command= lambda: connected(nom_input.get())).place_configure(x=125,y=250) File "e:\NSI\pychat\tkclient.py", line 51, in connected client_socket.connect((host, port)) OSError: [WinError 10056] A connection request has been made on an already connected socket
.
pouvez vous m'aider ? si vous avez d'autre idée que thread, par example avec after n'hesité pas
import socket
from tkinter import *
from outiltkinter import outilcanvas
from message import chat_message
import time
import threading
host = "127.0.0.1"
port = 9001
home_fen = ""
name = "clem"
nb_message = 0
def home_fen1():
global home_fen,name
home_fen = Tk()
nom = StringVar()
home_fen.title("PyChat")
home_fen.geometry("400x400")
test = Canvas(home_fen, width=400, height=400, background="white", highlightthickness=0)
test.place(x=0, y=0)
label = Label(home_fen, text="Bienvenue sur PyChat",font=("calibre",24)).place(x=50,y=50)
Label(home_fen, text="Veuillez rentré votre nom ! ",font=("calibre",10)).place(x=110,y=126)
nom_input = Entry(home_fen,textvariable=nom,font=("calibre",10),bg="red")
nom_input.place(x=110,y=175)
o = outilcanvas(home_fen,test)
btn_connect = Button(home_fen,text="Connecter",width=15, command= lambda: connected(nom_input.get())).place_configure(x=125,y=250)
home_fen.mainloop()
def receive_messages(client_socket, frame):
global nb_message, name
donnees_recues = client_socket.recv(1024).decode()
for i in range(len(donnees_recues)):
if donnees_recues[i] == "@":
user = donnees_recues[i+1:]
break
if donnees_recues and user != name:
chat_message(donnees_recues, frame)
def connected(name):
global client_socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# connexion au serveur
client_socket.connect((host, port))
print('Connexion au serveur réussie !')
launch_chat()
except Exception as e:
print(f'Erreur de connexion au serveur: {e}')
client_socket.connect((host, port))
print("fin")
def launch_chat():
global client_socket
thread2 = threading.Thread(target=receive_messages, args=(client_socket, chat_box))
thread2.start()
chat_page(client_socket,name)
def chat_page(client_socket,name):
home_fen.destroy()
chat_fen = Tk()
chat_fen.title("PyChat")
chat_fen.geometry("1300x700")
message = StringVar()
test = Canvas(chat_fen, width=1500, height=800, background="white", highlightthickness=0)
title = Label(chat_fen, text="PyChat",font=("calibre",40,"bold"))
title.place(x=10,y=10)
test.place(x=0, y=0)
chat_box = Frame(chat_fen, bg='ivory')
chat_box.place(x=310,y=110,width=950,height=500)
chat_entry = Entry(chat_fen,textvariable=message,font=("calibre",10),bg="red")
chat_entry.place(x=310,y=610,width=800,height=50)
btn_send = Button(chat_fen,text="Envoyer !", command= lambda: send_message(client_socket, name,chat_entry.get(),chat_box))
btn_send.place(x=1110,y=610,width=150,height=50)
o = outilcanvas(chat_fen,test)
chat_fen.mainloop()
def send_message(client_socket, name,message,frame):
global nb_message
fmessage = f"{message} #{nb_message} @{name}"
client_socket.send(fmessage.encode("utf-8"))
donnees_recues = client_socket.recv(1024).decode()
if donnees_recues:
nb_message = nb_message +1
chat_message(fmessage,frame)
home_fen1()