Liaison Socket / Tkinter

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:
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()

3 réponses

  1. quent217 Messages postés 424 Statut Membre 348
     
    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.
    0
    1. Arm
       
      Bonjour,
      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é):


      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()
      0
  2. quent217 Messages postés 424 Statut Membre 348
     
    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
    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.
    0
    1. Arm
       
      Merci pour votre réponse.
      J'ai utilisé le threading et cela marche très bien
      Seulement, j'ai maintenant un problème car une fois que j'ai envoyé une donnée, celles que j'envoie après ne sont pas reçues
      0
      1. quent217 Messages postés 424 Statut Membre 348 > Arm
         
        Pourquoi pensez-vous que les données envoyées ne sont pas reçues ?
        Pouvez-vous poster le code que vous avez fait ?
        0
  3. Arm
     
    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:

    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 ;)
    0