Liaison Socket / Tkinter
Arm
-
Arm -
Arm -
Bonjour, pour un projet je souhaite réaliser une interface graphique Tkinter qui permettrait d'envoyer des données via Socket (images et textes). Le programme gère client ET serveur, il faut juste sélectionner de quel côté nous voulons aller. Mon problème c'est que je ne sais comment faire fonctionner l'attente du socket côté client puisqu'avec un while true la mainloop Tkinter ne fonctionne pas et la fenêtre ne fonctionne plus, ce qui est logique.
Merci de votre aide
Voici mon code:
Merci de votre aide
Voici mon code:
import tkinter as tk
from tkinter.filedialog import *
from tkinter.messagebox import *
import socket
import time
global socket
global client
global log
def Accueil():
global root
root = tk.Tk()
root.title("Espace élèves")
root.config(bg='#A26F65')
root.geometry('1650x1050')
entete = tk.Label(root, text='Bienvenue sur votre espace pedagogique !', font = ('Tw Cen MT', 30))
entete.place(x=490, y=200, anchor='w')
Bouton = tk.Button(root, text ="Espace élèves",command = eleve, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white")
Bouton.place(x=500, y=400, anchor='w')
Bouton = tk.Button(root, text ="Espace professeur",command = prof, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white")
Bouton.place(x=1000, y=400, anchor='w')
Bouton = tk.Button(root, text ='Quitter',command = quitterAccueil, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white")
Bouton.place(x=1500, y=900, anchor='se' )
root.mainloop()
def prof():
quitterAccueil()
global prof1
prof1 = tk.Tk()
prof1.title("Espace professeurs")
prof1.config(bg='#A26F65')
prof1.geometry('1650x1050')
global Motdepasseprof
Motdepasseprof = tk.StringVar()
Champ = tk.Entry(prof1, textvariable= Motdepasseprof, show='*', bg ='bisque', fg='black')
Champ.focus_set()
Champ.place(x=780, y=300, anchor='w')
Bouton = tk.Button(prof1, text ="Quitter",command = quitterMDPprof, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white")
Bouton.place(x=1500, y=900, anchor='w')
Bouton = tk.Button(prof1, text ="Valider",command = VerificationProf, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white")
Bouton.place(x=805, y=400, anchor='w')
entete = tk.Label(prof1, text='Saisir votre mot de passe', font = ('Tw Cen MT', 20))
entete.place(x=700, y=200, anchor='w')
Bouton = tk.Button(prof1, text ="Retour",command = RetourAccueilPr, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white")
Bouton.place(x=1400, y=900, anchor='w')
prof1.mainloop()
def eleve():
quitterAccueil()
global eleve1
eleve1 = tk.Tk()
eleve1.title("Espace élèves")
eleve1.config(bg='#A26F65')
eleve1.geometry('1650x1050')
global Motdepasseeleve
Motdepasseeleve= tk.StringVar()
Champ = tk.Entry(eleve1, textvariable= Motdepasseeleve, show='*', bg ='bisque', fg='black')
Champ.focus_set()
Champ.place(x=780, y=300, anchor='w')
Bouton = tk.Button(eleve1, text ="Valider",command = VerificationEleve, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white")
Bouton.place(x=805, y=400, anchor='w')
Bouton = tk.Button(eleve1, text ="Quitter",command = quitterMDPeleve, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white")
Bouton.place(x=1500, y=900, anchor='w')
Bouton = tk.Button(eleve1, text ="Retour",command = RetourAccueilEl, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white")
Bouton.place(x=1400, y=900, anchor='w')
entete = tk.Label(eleve1, text='Saisir votre mot de passe', font = ('Tw Cen MT', 20))
entete.place(x=700, y=200, anchor='w')
eleve1.mainloop()
def VerificationEleve():
if Motdepasseeleve.get() == 'eleve':
showinfo('Résultat','Mot de passe correct')
eleve2()
else:
showwarning('Résultat','Mot de passe incorrect')
Motdepasseeleve.set('')
def VerificationProf():
if Motdepasseprof.get() == 'prof':
showinfo('Résultat','Mot de passe correct!')
prof2()
else:
showwarning('Résultat','Mot de passe incorrect!')
Motdepasseprof.set('')
def prof2():
quitterMDPprof()
global prof2
prof2 = tk.Tk()
prof2.title("Espace professeurs")
prof2.config(bg='#A26F65')
prof2.geometry('1650x1050')
global gifdict
gifdict={}
entete = tk.Label(prof2, text='Bienvenue à toi jeune prof', font = ('Tw Cen MT', 25))
entete.place(x=650, y=200, anchor='w')
global exoaenvoyer
entete = tk.Label(prof2, text='Envoyer une image', font = ('Tw Cen MT', 15))
entete.place(x=250, y=300, anchor='w')
entete = tk.Label(prof2, text='Envoyer un texte', font = ('Tw Cen MT', 15))
entete.place(x=1250, y=300, anchor='w')
Bouton = tk.Button(prof2, text ="Quitter",command = quitterProf, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white")
Bouton.place(x=1500, y=900, anchor='w')
Bouton = tk.Button(prof2, text ="Ouvrir une Image",command = OuvrirImage, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white")
Bouton.place(x=250, y=500, anchor='w')
exoaenvoyer = tk.StringVar()
Champ = tk.Entry(prof2, textvariable= exoaenvoyer, bg ='bisque', fg='black')
Champ.focus_set()
Champ.place(x=1170, y=400, anchor='w', width = 300)
Bouton = tk.Button(prof2, text ="Envoyer",command = envoyertext, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white")
Bouton.place(x=1280, y=500, anchor='w')
prof2.mainloop()
def eleve2():
quitterMDPeleve()
global eleve2
eleve2 = tk.Tk()
eleve2.title("Espace élèves")
eleve2.config(bg='#A26F65')
eleve2.geometry('1650x1050')
global log
log = tk.Text(eleve2, width=25, height=20, takefocus=0, font = ('Tw Cen MT', 15))
log.place(x=400, y=310, anchor='w')
global socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('172.18.189.128', 15555))
chrono = time.time()
global client,adress
while True:
socket.listen(5)
client, address = socket.accept()
print ("{} connected".format( address ))
response = client.recv(255)
if response != "":
response2 = response.decode('utf-8')
log.insert(END, response2)
client.close()
socket.close()
eleve2.mainloop()
def OuvrirImage():
filename = tk.filedialog.askopenfilename(title="Ouvrir une image",filetypes=[('gif files','.gif'),('all files','.*')])
print(filename)
photo = PhotoImage(file=filename)
gifdict[filename] = photo # référence
print(gifdict)
def envoyertext():
exot = exoaenvoyer.get()
hote = "172.18.189.97"
port = 15555
global socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((hote,port))
print ("Connecté au prof")
exot2 = bytes(exot, encoding='utf-8')
socket.send(exot2)
print("Envoyé")
socket.close()
def verifsock():
global socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('192.168.43.125', 15555))
socket.listen(5)
client, address = socket.accept()
print ("{} connected".format( address ))
response = client.recv(255)
if response != "":
log.insert(END, response)
else:
return
after_id = eleve2.after(10, verifsock)
def quitterAccueil():
root.destroy()
def quitterProf():
prof2.destroy()
def quitterMDPprof():
prof1.destroy()
def quitterMDPeleve():
eleve1.destroy()
def RetourAccueilEl():
eleve1.destroy()
Accueil()
def RetourAccueilPr():
prof1.destroy()
Accueil()
Accueil()
A voir également:
- Liaison Socket / Tkinter
- Liaison torride ✓ - Forum Consommation & Internet
- Acheminé sur une liaison internationale - Forum Réseau
- Error 2002 (hy000): can't connect to local server through socket '/run/mysqld/mysqld.sock' (2) ✓ - Forum Linux / Unix
- Super Chronopost International - Forum Vos droits sur internet
- Carte mere socket 1155 ✓ - Forum Carte-mère/mémoire
3 réponses
Bonjour,
Lorsque vous postez du code, faites le avec les indentations, surtout pour du python. Il faut séléctionner le langage python dans la liste déroulante quand vous ajoutez la balise de code.
Sinon pour votre problème vous pouvez utiliser le module select comme dans l'exemple ici : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/234698-gerez-les-reseaux
Ou vous pouvez aussi utiliser un thread différent pour attendre les nouvelles connexions avec le module threading.
Lorsque vous postez du code, faites le avec les indentations, surtout pour du python. Il faut séléctionner le langage python dans la liste déroulante quand vous ajoutez la balise de code.
Sinon pour votre problème vous pouvez utiliser le module select comme dans l'exemple ici : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/234698-gerez-les-reseaux
Ou vous pouvez aussi utiliser un thread différent pour attendre les nouvelles connexions avec le module threading.
Bonjour,
Je suis désolé, je vais revenir sur mon message précédent.
Le module select permet au serveur d'accepter plusieurs clients simultanément, si ce n'est pas prévu dans votre programme le module select n'est peut-être pas nécessaire.
Vous pouvez rendre les sockets non bloquants avec
Vous pouvez ensuite utiliser la méthode after de tkinter pour appeler une fonction toutes les 100ms par exemple et à chaque fois vous testez si un nouveau client s'est connecté ou si un nouveau message est arrivé.
Si il peut y avoir plusieurs clients en même temps, vous pouvez faire la même chose mais en utilisant le module select pour vérifier si de nouveaux clients ou de nouveaux messages sont arrivés.
J'éspère que mon explication n'est pas trop confuse.
Je suis désolé, je vais revenir sur mon message précédent.
Le module select permet au serveur d'accepter plusieurs clients simultanément, si ce n'est pas prévu dans votre programme le module select n'est peut-être pas nécessaire.
Vous pouvez rendre les sockets non bloquants avec
socket.setblocking(False).
Vous pouvez ensuite utiliser la méthode after de tkinter pour appeler une fonction toutes les 100ms par exemple et à chaque fois vous testez si un nouveau client s'est connecté ou si un nouveau message est arrivé.
Si il peut y avoir plusieurs clients en même temps, vous pouvez faire la même chose mais en utilisant le module select pour vérifier si de nouveaux clients ou de nouveaux messages sont arrivés.
J'éspère que mon explication n'est pas trop confuse.
Finalement, j'ai trouvé le problème: j'avais oublié un while True dans le thread pour qu'il se répète, ce qui faisait qu'une fois le thread démarré il ne s'éxecutait qu'une fois...
Toute cette partie liée à Socket est donc résolue (j'ai cepndant des problèmes avec le module csv maintenant...)
Voici mon code pour ceux que cela interesse:
Merci pour votre aide ;)
Toute cette partie liée à Socket est donc résolue (j'ai cepndant des problèmes avec le module csv maintenant...)
Voici mon code pour ceux que cela interesse:
import tkinter as tk from tkinter.filedialog import * from tkinter.messagebox import * import socket import csv import time import threading global socket global client global log global fichiercsv fichiercsv = 'LST.csv' def Accueil(): global root root = tk.Tk() root.title("Espace élèves") root.config(bg='#A26F65') root.geometry('1650x1050') entete = tk.Label(root, text='Bienvenue sur votre espace pedagogique !', font = ('Tw Cen MT', 30)) entete.place(x=490, y=200, anchor='w') Bouton = tk.Button(root, text ="Espace élèves",command = eleve, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=500, y=400, anchor='w') Bouton = tk.Button(root, text ="Espace professeur",command = prof, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=1000, y=400, anchor='w') Bouton = tk.Button(root, text ="Enregistrer un nouvel identifiant",command = regisID, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=680, y=450, anchor='w') Bouton = tk.Button(root, text ='Quitter',command = quitterAccueil, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=1500, y=900, anchor='se' ) root.mainloop() def adminCheck(): global adminCheck adminCheck = tk.Tk() adminCheck.title("Saisir les identifiants admin") adminCheck.config(bg='#ff5050') adminCheck.geometry('400x400') entete = tk.Label(adminCheck, text='Saisissez vos identifiants\nadmin', font = ('Tw Cen MT', 18)) entete.place(x=95, y=80, anchor='w') global IDadmin IDadmin = tk.StringVar() Champ = tk.Entry(adminCheck, textvariable= IDadmin, bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=145, y=140, anchor='w') global MDPadmin MDPadmin = tk.StringVar() Champ = tk.Entry(adminCheck, textvariable= MDPadmin,show= '*', bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=145, y=180, anchor='w') Bouton = tk.Button(adminCheck, text ="Valider",command = adminverif, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=170, y=260, anchor='w') Bouton = tk.Button(adminCheck, text ="Quitter",command = quitterAdm, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=172, y=330, anchor='w') adminCheck.mainloop() def adminverif(): global IDadmin2 global MDPadmin2 IDadmin2 = IDadmin.get() MDPadmin2 = MDPadmin.get() fichiercsv2 = open(fichiercsv, 'r',encoding='utf 8') csvRead = csv.reader(fichiercsv2, delimiter=',') for row in csvRead : if row : if row[0] == "admin" : if row[1] == MDPadmin2 : showinfo("Validation","Identifiants corrects!") regisID() else: showwarning('Erreur','Mot de passe incorrect !') MDPadmin.set('') else: showwarning('Erreur','Identifiant inconnu !') MDPadmin.set('') IDadmin.set('') def regisID(): global regisIDD regisIDD = tk.Tk() regisIDD.title("Enregistrer un nouvel identifiant") regisIDD.config(bg='#ff5050') regisIDD.geometry('400x400') entete = tk.Label(regisIDD, text='Saisissez vos identifiants', font = ('Tw Cen MT', 18)) entete.place(x=95, y=80, anchor='w') global IDareg IDareg = tk.StringVar() Champ = tk.Entry(regisIDD, textvariable= IDareg, bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=145, y=140, anchor='w') global MDPareg MDPareg = tk.StringVar() Champ = tk.Entry(regisIDD, textvariable= MDPareg, bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=145, y=180, anchor='w') Bouton = tk.Button(regisIDD, text ="Valider",command = regcl, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=170, y=260, anchor='w') Bouton = tk.Button(regisIDD, text ="Quitter",command = quitterReg, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=172, y=330, anchor='w') regisIDD.bind('<Return>', regcl2) regisIDD.mainloop() def regcl(): global newuser global newpss newuser = IDareg.get() newpss = MDPareg.get() print(newuser) print(newpss) fichiercsv2 = open(fichiercsv, 'a',encoding='utf-8', newline ='') cswri = csv.writer(fichiercsv2) cswri.writerow((newuser,newpss)) fichiercsv2.close() showinfo("Validation","Identifiants enregistrés") regisIDD.destroy() def regcl2(event): regcl() def prof(): quitterAccueil() global prof1 prof1 = tk.Tk() prof1.title("Espace professeurs") prof1.config(bg='#A26F65') prof1.geometry('1650x1050') prof1.bind('<Return>', VerifElPr) global usernamePr usernamePr= tk.StringVar() Champ = tk.Entry(prof1, textvariable= usernamePr, bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=780, y=300, anchor='w') global Motdepasseprof Motdepasseprof = tk.StringVar() Champ = tk.Entry(prof1, textvariable= Motdepasseprof, show='*', bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=780, y=330, anchor='w') Bouton = tk.Button(prof1, text ="Quitter",command = quitterMDPprof, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=1500, y=900, anchor='w') Bouton = tk.Button(prof1, text ="Valider",command = VerificationProf, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=805, y=400, anchor='w') entete = tk.Label(prof1, text='Saisir votre mot de passe', font = ('Tw Cen MT', 20)) entete.place(x=700, y=200, anchor='w') Bouton = tk.Button(prof1, text ="Retour",command = RetourAccueilPr, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=1400, y=900, anchor='w') prof1.mainloop() def eleve(): quitterAccueil() global eleve1 eleve1 = tk.Tk() eleve1.title("Espace élèves") eleve1.config(bg='#A26F65') eleve1.geometry('1650x1050') eleve1.bind('<Return>', VerifElMo) global usernameEl usernameEl= tk.StringVar() Champ = tk.Entry(eleve1, textvariable= usernameEl, bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=780, y=300, anchor='w') global Motdepasseeleve Motdepasseeleve= tk.StringVar() Champ = tk.Entry(eleve1, textvariable= Motdepasseeleve, show='*', bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=780, y=330, anchor='w') Bouton = tk.Button(eleve1, text ="Valider",command = VerificationEleve, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=805, y=400, anchor='w') Bouton = tk.Button(eleve1, text ="Quitter",command = quitterMDPeleve, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=1500, y=900, anchor='w') Bouton = tk.Button(eleve1, text ="Retour",command = RetourAccueilEl, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=1400, y=900, anchor='w') entete = tk.Label(eleve1, text='Saisir votre mot de passe', font = ('Tw Cen MT', 20)) entete.place(x=700, y=200, anchor='w') eleve1.mainloop() def VerifElMo(event): VerificationEleve() def VerificationEleve(): global motdepasseEl global usernameEl2 motdepasseEl = Motdepasseeleve.get() usernameEl2 = usernameEl.get() fichiercsv2 = open(fichiercsv, 'r',encoding='utf 8') csvRead = csv.reader(fichiercsv2, delimiter=',') for row in csvRead : if row : if row[0] == usernameEl2 : if row[1] == motdepasseEl : showinfo("Validation","Identifiants corrects!") eleve2() else: showwarning('Erreur','Mot de passe incorrect !') Motdepasseeleve.set('') else: showwarning('Erreur','Identifiant inconnu !') Motdepasseeleve.set('') usernameEl.set('') def VerifElPr(event): VerificationProf() def VerificationProf(): global motdepassePr global usernamePr2 motdepassePr = Motdepasseprof.get() usernamePr2 = usernamePr.get() fichiercsv2 = open(fichiercsv, 'r',encoding='utf 8') readCsv = csv.reader(fichiercsv2, delimiter=',') for row in readCsv: if row : if row[0] == usernamePr2 : if row[1] == motdepassePr : showinfo("Validation","Identifiants corrects!") prof2() else: showwarning('Erreur','Mot de passe incorrect !') Motdepasseprof.set('') else: showwarning('Erreur','Identifiant inconnu !') Motdepasseprof.set('') usernamePr.set('') def prof2(): quitterMDPprof() global prof2 prof2 = tk.Tk() prof2.title("Espace professeurs") prof2.config(bg='#A26F65') prof2.geometry('1650x1050') global gifdict gifdict={} entete = tk.Label(prof2, text='Bienvenue à toi jeune prof', font = ('Tw Cen MT', 25)) entete.place(x=650, y=200, anchor='w') global exoaenvoyer entete = tk.Label(prof2, text='Envoyer une image', font = ('Tw Cen MT', 15)) entete.place(x=250, y=300, anchor='w') entete = tk.Label(prof2, text='Envoyer un texte', font = ('Tw Cen MT', 15)) entete.place(x=1250, y=300, anchor='w') Bouton = tk.Button(prof2, text ="Quitter",command = quitterProf, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=1500, y=900, anchor='w') Bouton = tk.Button(prof2, text ="Ouvrir une Image",command = OuvrirImage, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=250, y=500, anchor='w') exoaenvoyer = tk.StringVar() Champ = tk.Entry(prof2, textvariable= exoaenvoyer, bg ='bisque', fg='black', justify='center') Champ.focus_set() Champ.place(x=1170, y=400, anchor='w', width = 300) Bouton = tk.Button(prof2, text ="Envoyer",command = envoyertext, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#644C47", fg ="white") Bouton.place(x=1280, y=500, anchor='w') prof2.mainloop() def eleve2(): quitterMDPeleve() global eleve2 eleve2 = tk.Tk() eleve2.title("Espace élèves") eleve2.config(bg='#A26F65') eleve2.geometry('1650x1050') global logRec Consigne = tk.StringVar() logRec = tk.Text(eleve2, width=120, height=15, takefocus=0, font = ('Tw Cen MT', 15)) logRec.place(x=230, y=200, anchor='w') env = tk.Label(eleve2, text='Consignes\nenvoyées', font = ('Tw Cen MT', 15), justify = 'center') env.place(x=70, y=80, anchor='w') logRep = tk.Text(eleve2, width=120, height=15, takefocus=0, font = ('Tw Cen MT', 15)) logRep.place(x=230, y=700, anchor='w') rep = tk.Label(eleve2, text='Réponses', font = ('Tw Cen MT', 15)) rep.place(x=70, y=590, anchor='w') Bouton = tk.Button(eleve2, text ="Copier la consigne",command = copyCons, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=800, y=410, anchor='w') Bouton = tk.Button(eleve2, text ="Envoyer la réponse",command = sendRep, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=800, y=910, anchor='w') Bouton = tk.Button(eleve2, text ="Quitter",command = quitterEleve2, font = ('Tw Cen MT', 15), overrelief= 'ridge', bg= "#6D2414", fg ="white") Bouton.place(x=1500, y=920, anchor='w') global threadEl threadEl = threading.Thread(target=verifsock) threadEl.daemon = True # without the daemon parameter, the function in parallel will continue even your main program ends threadEl.start() eleve2.mainloop() def verifsock(): global socket2 socket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) hostname = socket.gethostbyname(socket.gethostname()) socket2.bind((hostname, 15555)) while True: socket2.listen(5) client, address = socket2.accept() print ("{} connected".format( address )) response = client.recv(255) response2 = response.decode("utf-8") if response2 != "": logRec.insert(END, str(response2)+"\n") else: return def copyCons(): print("Aha") def sendRep(): print("Wsh") def OuvrirImage(): filename = tk.filedialog.askopenfilename(title="Ouvrir une image",filetypes=[('gif files','.gif'),('all files','.*')]) print(filename) photo = PhotoImage(file=filename) gifdict[filename] = photo # référence print(gifdict) def envoyertext(): exot = exoaenvoyer.get() hote = "172.16.2.220" port = 15555 global socket socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socket.connect((hote,port)) print ("Connecté aux élèves") exot2 = bytes(exot, encoding='utf-8') socket.send(exot2) print("Envoyé") socket.close() def quitterAdm(): adminCheck.destroy() def quitterReg(): regisIDD.destroy() def quitterEleve2(): eleve2.destroy() def quitterAccueil(): root.destroy() def quitterProf(): prof2.destroy() def quitterMDPprof(): prof1.destroy() def quitterMDPeleve(): eleve1.destroy() def RetourAccueilEl(): eleve1.destroy() Accueil() def RetourAccueilPr(): prof1.destroy() Accueil() Accueil()
Merci pour votre aide ;)
Excusez moi pur l'indentation je n'ai pas fait attention :/
Sinon le module select à l'air de pouvoir faire l'affaire mais je ne sais pas comment l'implémenter à mon code... Pouvez vous me donner des pistes ?
Merci beaucoup
Voici mon code (indenté):