Skip to content
Snippets Groups Projects
Commit a1b9ece4 authored by ALLAOUA Rayen's avatar ALLAOUA Rayen :speech_balloon:
Browse files

Add new file

parent 344b052d
No related branches found
No related tags found
No related merge requests found
import tkinter as tk # Importation de la bibliothèque tkinter pour créer une interface graphique
from tkinter import messagebox # Importation de la fonction messagebox de tkinter pour afficher des messages
import socket # Importation de la bibliothèque socket pour la communication réseau
import threading # Importation de threading pour gérer les connexions concurrentes
client = None # Initialisation de la variable client à None
HOST_ADDR = "127.0.0.1" # Définition de l'adresse IP du serveur
HOST_PORT = 8080 # Définition du port du serveur
window = tk.Tk() # Création de la fenêtre principale de l'interface graphique
window.title("Utilisateur/Client") # Définition du titre de la fenêtre
def connect():
global username, client # Déclaration des variables globales username et client
if len(entName.get()) < 1: # Vérification si le champ de nom est vide
tk.messagebox.showerror(title="Erreur/Error!", message="Veuillez entrer votre prénom, <exemple, Reyai>")
else:
username = entName.get() # Récupération du nom entré par l'utilisateur
connect_to_server(username) # Appel à la fonction pour se connecter au serveur
def connect_to_server(name):
global client, HOST_PORT, HOST_ADDR # Déclaration des variables globales client, HOST_PORT et HOST_ADDR
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Création du socket client TCP
client.connect((HOST_ADDR, HOST_PORT)) # Connexion au serveur avec l'adresse et le port spécifiés
client.send(name.encode("utf-8")) # Envoi du nom d'utilisateur encodé au serveur
entName.config(state=tk.DISABLED) # Désactivation du champ de nom
connectButton.config(state=tk.DISABLED) # Désactivation du bouton de connexion
tkMessage.config(state=tk.NORMAL) # Activation de la zone de message pour envoyer des messages au serveur
threading._start_new_thread(recv_msg, (client,)) # Démarrage d'un thread pour recevoir les messages du serveur
except socket.error as e:
print(e) # Affichage de l'erreur en cas d'échec de connexion
def recv_msg(sock):
while True:
data = sock.recv(4096) # Réception des données/messages du serveur
if not data: # Vérification si aucune donnée n'est reçue
break
# Activation de la zone d'affichage et insertion du texte reçu
texts = tkDisplay.get("1.0", tk.END).strip()
tkDisplay.config(state=tk.NORMAL) # Activation de la zone de texte
if len(texts) < 1:
tkDisplay.insert(tk.END, data) # Insertion du texte à la fin de la zone de texte
else:
tkDisplay.insert(tk.END, "\n\n" + data.decode("utf-8")) # Insertion du texte avec un saut de ligne
tkDisplay.config(state=tk.DISABLED) # Désactivation de la zone de texte
tkDisplay.see(tk.END) # Défilement automatique de la zone de texte vers le bas
print("Reçu du serveur :/Recvd from server: "+data.decode("utf-8")) # Affichage du message reçu du serveur dans la console
sock.close() # Fermeture de la connexion avec le serveur
window.destroy() # Fermeture de la fenêtre de l'interface graphique
def getChatMessage(msg):
msg = msg.replace('\n', '') # Suppression des sauts de ligne dans le message
texts = tkDisplay.get("1.0", tk.END).strip() # Récupération du texte de la zone de texte
tkDisplay.config(state=tk.NORMAL) # Activation de la zone de texte
if len(texts) < 1:
tkDisplay.insert(tk.END, "You->" + msg, "tag_your_message") # Insertion du message dans la zone de texte
else:
tkDisplay.insert(tk.END, "\n\n"+"You->"+msg, "tag_your_message") # Insertion du message avec un saut de ligne
tkDisplay.config(state=tk.DISABLED) # Désactivation de la zone de texte
send_message_to_server(msg) # Appel à la fonction pour envoyer le message au serveur
tkDisplay.see(tk.END) # Défilement automatique de la zone de texte vers le bas
tkMessage.delete('1.0', tk.END) # Effacement du champ de message après l'envoi
def send_message_to_server(msg):
client.send(msg.encode("utf-8")) # Envoi du message encodé au serveur
if msg == "exit": # Vérification si le message est "exit" pour fermer la connexion
client.close() # Fermeture de la connexion avec le serveur
window.destroy() # Fermeture de la fenêtre de l'interface graphique
print("Envoyé un message / Sent message.") # Affichage dans la console pour indiquer que le message a été envoyé
# Création de la partie supérieure de l'interface graphique avec le champ de nom et le bouton de connexion
topFrame = tk.Frame(window)
nameLabel = tk.Label(topFrame, text="Nom:") # Label pour le champ de nom
nameLabel.pack(side=tk.LEFT) # Placement du label à gauche
entName = tk.Entry(topFrame) # Champ de texte pour saisir le nom
entName.pack(side=tk.LEFT) # Placement du champ de texte à gauche
connectButton = tk.Button(topFrame, text="Se connecter", command=connect) # Bouton de connexion
connectButton.pack(side=tk.LEFT) # Placement du bouton à gauche
topFrame.pack(side=tk.TOP) # Placement de la partie supérieure en haut de la fenêtre
# Création de la partie centrale de l'interface graphique pour afficher les messages du serveur
displayFrame = tk.Frame(window)
headingLine = tk.Label(displayFrame, text="Utilisateur") # Ligne de séparation
headingLine.pack() # Placement de la ligne de séparation
scrollBar = tk.Scrollbar(displayFrame) # Barre de défilement
scrollBar.pack(side=tk.RIGHT, fill=tk.Y) # Placement de la barre de défilement à droite
tkDisplay = tk.Text(displayFrame, height=20, width=55) # Zone de texte pour afficher les messages
tkDisplay.pack(side=tk.LEFT, fill=tk.Y, padx=(5,0)) # Placement de la zone de texte à gauche
scrollBar.config(command=tkDisplay.yview) # Configuration de la barre de défilement pour fonctionner avec la zone de texte
tkDisplay.config(yscrollcommand=scrollBar.set, background="#FFC0CB", highlightbackground="white", state="disabled") # Configuration de la zone de texte
displayFrame.pack(side=tk.TOP) # Placement de la partie centrale en haut de la fenêtre
# Création de la partie inférieure de l'interface graphique pour taper et envoyer des messages
bottomFrame = tk.Frame(window)
tkMessage = tk.Text(bottomFrame, height=2, width=55) # Zone de texte pour taper le message
tkMessage.pack(side=tk.LEFT, padx=(5, 13), pady=(5, 10)) # Placement de la zone de texte à gauche
tkMessage.config(highlightbackground="grey", state="disabled") # Configuration de la zone de texte
tkMessage.bind("<Return>", (lambda event: getChatMessage(tkMessage.get("1.0", tk.END)))) # Liaison de la touche "Entrée" pour envoyer le message
bottomFrame.pack(side=tk.BOTTOM) # Placement de la partie inférieure en bas de la fenêtre
window.mainloop() # Lancement de la boucle principale pour exécuter l'interface graphique
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment