Partage
  • Partager sur Facebook
  • Partager sur Twitter

Découverte de Tkinter

Sujet résolu
    3 juin 2019 à 21:52:00

    Salut,

    je suis entrain de m'exercer un peu sur Tkinter et j'ai un petit soucis. Tout d'abord, voici le code :

    def valide(*args) : 
    	if ent.get() == "password" and ent2.get()=="user": 
    		print("Ca marche !")
    def test(*args):
    	pass
    app = tkinter.Tk()
    app.geometry("200x150")
    app.title("Identification")
    
    label = tkinter.Label(app,text="Entrez le user")
    label2 = tkinter.Label(app,text="Entrez le password")
    btn = tkinter.Button(app,text="Valider",command=valide)
    ent = tkinter.Entry(app,text="Saisi texte")
    ent2 = tkinter.Entry(app,text="Saisi texte")
    
    label.pack()
    ent.pack()
    label2.pack()
    ent2.pack()
    
    btn.pack()
    
    app.mainloop()

    Le problème est lorsque j'exécute le programme et que j'écris quelque chose sur le widget Entry, le texte écrit sur le premier widget est copié sur le second widget Entry. Je ne comprends pas d'où vient ce lien et comment le briser ?

    Merci d'avance pour votre aide :D

    Edit:

    J'ai trouvé la solution. J'avoue ne pas trop comprendre, mais le problème vient de ces 2 lignes :

    ent = tkinter.Entry(app,text="Saisi texte")
    ent2 = tkinter.Entry(app,text="Saisi texte")

    lorsque j'ai supprimé "Saisi texte", ca a fonctionné. De plus j'ai inversé les 2 champs Entry dans l'interface.

    -
    Edité par zaki95 3 juin 2019 à 23:20:42

    • Partager sur Facebook
    • Partager sur Twitter
      4 juin 2019 à 3:04:07

      On dirait comme un bug de Tkinter (assez improbable toutefois). Officiellement, je ne vois pas d'option text pour une Entry. Il y a bien une option textvariable qui reçoit une variable dynamique. On dirait que ton option text a créé un attribut statique de la classe Entry puisque si on met une 3e entrée avec l'option text, cela écrit partout (dans les trois entrées) le texte (comme une variable dynamique justement).

      En ce qui concerne ce que tu veux faire et en reprenant ton code :

      import  tkinter 
      def valide(*args) :
          if user.get() == "moi" and mdp.get()=="3.14":
              print("Ca marche !")
          else:
              print("Erreur !")
              
      
      app = tkinter.Tk()
      app.geometry("200x150")
      app.title("Identification")
      
      user=tkinter.StringVar()
      mdp=tkinter.StringVar()
       
      label = tkinter.Label(app,text="Entrez le user")
      label2 = tkinter.Label(app,text="Entrez le password")
      btn = tkinter.Button(app,text="Valider",command=valide)
      ent = tkinter.Entry(app, textvariable=user)
      ent2 = tkinter.Entry(app, textvariable=mdp)
      
       
      label.pack()
      ent.pack()
      label2.pack()
      ent2.pack()
       
      btn.pack()
      print("\n"*6)
       
      app.mainloop()
      



      -
      Edité par PascalOrtiz 4 juin 2019 à 3:07:32

      • Partager sur Facebook
      • Partager sur Twitter
        4 juin 2019 à 9:17:41

        C'est noté, merci pour ton explication. Je vais tester tout de suite ^^
        • Partager sur Facebook
        • Partager sur Twitter
          4 juin 2019 à 13:05:36

          Et avec un affichage plus dans la console mais dans un label :

          from tkinter import *
          
          def estValide() :
              if user.get() == "moi" and mdp.get()=="3.14":
                  label_login["text"]="Login correct"
              else:
                  label_login["text"]="Login incorrect"
          
          app = Tk()
          
          user=StringVar()
          mdp=StringVar()
           
          label_user = Label(app,text="Identifiant")
          label_mdp = Label(app,text="Mot de passe")
          label_login = Label(app, font="Arial 20 bold")
          
          btn = Button(app,text="Valider",command=estValide, width=20)
          entry_user = Entry(app, textvariable=user)
          entry_mdp = Entry(app, textvariable=mdp, show="*")
          
           
          label_user.pack()
          entry_user.pack()
          
          label_mdp.pack()
          entry_mdp.pack()
           
          btn.pack(padx=100)
          label_login.pack()
           
          app.mainloop()
          



          -
          Edité par PascalOrtiz 5 juin 2019 à 2:10:38

          • Partager sur Facebook
          • Partager sur Twitter
            7 juin 2019 à 23:10:53

            Ca me semble pas mal, j'ai juste un petit soucis lors de l'exécution du programme (pour infos j'ai tout regroupé dans une classe, je ne sais pas si c'est comme ca que cela doit se faire) :

            import tkinter as tk
            
            class GUI(tk.Tk):
            	def __init__(self):
            		tk.Tk.__init__(self)
            		self.configFenetre()
            		self.affichageUser()
            		self.initMenu()
            	def initMenu(self):
            		self.mainMenu = tk.Menu(self)
            		self.firstMenu = tk.Menu(self.mainMenu,tearoff =0 )
            		self.firstMenu.add_command(label="Ouvrir")
            		self.secondMenu = tk.Menu(self.mainMenu,tearoff =0 )
            		self.secondMenu.add_command(label="A propos de")
            		self.mainMenu.add_cascade(label="Fichier",menu=self.firstMenu)
            		self.mainMenu.add_cascade(label="Aide",menu=self.secondMenu)
            		self.config(menu=self.mainMenu)
            
            	def configFenetre(self) :
            		self.title("Coffre fort")
            		self.geometry("200x200")
            
            	def affichageUser(self):
            		self.user = tk.StringVar()
            		self.password = tk.StringVar()
            		tk.Label(self,text = "Entrez le nom d'utilisateur :").pack()
            		self.enterUser = tk.Entry(self,textvariable = self.user).pack()
            		tk.Label(self,text = "Entrez le mot de passe :").pack()
            		self.enterPass = tk.Entry(self,textvariable = self.password,show="*").pack()
            		tk.Button(self,text = "Valider", command = self.gestionCompte).pack()
            		self.labelLogin = tk.Label(self, font="Arial 20 bold").pack()
            	def gestionCompte(self) :
            		if self.user.get() == "test" and self.password.get() == "azerty" :
            			print("ok")
            		else :
            			self.labelLogin["text"]="Login incorrect"
            
            
            app=GUI()
            app.mainloop()

            Message d'erreur affichée par l'interpréteur :

             "File "main.py", line 53, in gestionCompte
                self.labelLogin["text"]="Login incorrect"
            TypeError: 'NoneType' object does not support item assignment"

            -
            Edité par zaki95 7 juin 2019 à 23:25:12

            • Partager sur Facebook
            • Partager sur Twitter
              7 juin 2019 à 23:45:49

              Ligne 31 : la méthode pack ne renvoie rien. Il faut découpler la création du widget et son placement dans la fenêtre, regarde mon code au message précédent.
              • Partager sur Facebook
              • Partager sur Twitter
                8 juin 2019 à 0:09:28

                PascalOrtiz a écrit:

                Ligne 31 : la méthode pack ne renvoie rien. Il faut découpler la création du widget et son placement dans la fenêtre, regarde mon code au message précédent.

                J'ai corrigé et ca marche. Merci ;)

                -
                Edité par zaki95 8 juin 2019 à 15:48:45

                • Partager sur Facebook
                • Partager sur Twitter
                  9 juin 2019 à 9:14:46

                  Salut,

                  Comme expliqué ici: https://stackoverflow.com/a/46887882, l'option text est un raccourci pour textvariable. Donc tes deux Entry sont créés avec un même textvariable et donc partagent le même contenu.

                  -
                  Edité par Dan737 9 juin 2019 à 9:15:08

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Découverte de Tkinter

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown