Partage
  • Partager sur Facebook
  • Partager sur Twitter

Class et Global

Sujet résolu
    18 janvier 2023 à 0:20:36

    Bonsoir a tous,

    Je suis entrain de mettre un pavé numérique qui ecrit dans un Entry sur l'une de mes frames dans mon appli mais j'ai un problème de variable.

    En effet, avant d'integrer mon pavé numérique dans mon programme je l'ai fais a part dans une fenetre. Il marche parfaitement bien.

    En revanche quand je l'adapte a mon programme, j'ai l'erreur "NameError: name 'formule' is not defined" qui apparait lorsque j'appuis sur un de mes boutons.

    J'ai fais quelques recherches avant de vous écrire et il est probable que ca vienne de mon "global" dans ma classe.

    Le problème vient de ' formule = "" '(ligne 6),il n'est pas reconnu dans ma fonction

    Pourriez-vous m’éclairer, voici une partie du code

    class LivRec(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master)
    
            
            formule = ""
        
            def click_def(num): 
                
                global formule
                formule = formule + str(num) 
                entrer_id.set(formule)
    
            def effacer(): 
                global formule 
                formule = "" 
                entrer_id.set("")    
            
    
            label_saisie = tk.Label(self,text="Saisir identifiant puis valider",font=("Times New Roman",20))
            label_saisie.grid(column=0,columnspan=3,row=3,pady=5)
    
            lframe = LabelFrame(self, width=400, height=400)
            lframe.grid(column=0,columnspan=3,row=5)
    
            entrer_id = tk.StringVar()
            saisie_id = tk.Entry(lframe,textvariable=entrer_id, font=("Times New Roman",30),bd = 2,width=12)#,show="*")
            saisie_id.grid(column=0,columnspan=3,row=0)
            saisie_id.focus_set()
    
            bouton7 = Button(lframe,text="7",width=5,command=lambda: click_def(7),font=("Times New Roman",40)).grid(column=0,row=1)
            bouton8 = Button(lframe,text="8",width=5,command=lambda: click_def(8),font=("Times New Roman",40)).grid(column=1,row=1)
            bouton9 = Button(lframe,text="9",width=5,command=lambda: click_def(9),font=("Times New Roman",40)).grid(column=2,row=1)
    
            bouton4 = Button(lframe,text="4",width=5,command=lambda: click_def(4),font=("Times New Roman",40)).grid(column=0,row=2)
            bouton5 = Button(lframe,text="5",width=5,command=lambda: click_def(5),font=("Times New Roman",40)).grid(column=1,row=2)
            bouton6 = Button(lframe,text="6",width=5,command=lambda: click_def(6),font=("Times New Roman",40)).grid(column=2,row=2)
    
            bouton1 = Button(lframe,text="1",width=5,command=lambda: click_def(1),font=("Times New Roman",40)).grid(column=0,row=3)
            bouton2 = Button(lframe,text="2",width=5,command=lambda: click_def(2),font=("Times New Roman",40)).grid(column=1,row=3)
            bouton3 = Button(lframe,text="3",width=5,command=lambda: click_def(3),font=("Times New Roman",40)).grid(column=2,row=3)
    
            bouton_diese = Button(lframe,text="#",width=5,command=lambda: click_def("#"),font=("Times New Roman",40)).grid(column=0,row=4)
            bouton0 = Button(lframe,text="0",width=5,command=lambda: click_def(0),font=("Times New Roman",40)).grid(column=1,row=4)
            bouton_eff = Button(lframe,text="Effacer",width=5,command=effacer,font=("Times New Roman",40)).grid(column=2,row=4)
    
            
    
            bouton_valider = tk.Button(self,text="Valider",height=1,width=20, font=("Times New Roman",25),command=lambda: master.switch_frame(PageLAC))
            bouton_valider.grid(column=0,columnspan=3,row=6,pady=30)


    Bien à vous

    Anthony

    -
    Edité par AnthonyGerbault1 18 janvier 2023 à 0:22:33

    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2023 à 2:44:48

      En disant que formule est global, Python va chercher hors de ta classe, pas hors des autres fonctions ni dans le __init__
      Ensuite, je fais le petit test:
       
      class toto:
          def __init__(self, n=1):
              self.n=n
              def tata(self, z):
                  self.z=z
      x=toto(2)
      x.tata(3)
       
      Traceback (most recent call last):                                                                                      
        File "C:\Users\Administrateur\Documents\Sources\az.py", line 7, in <module>                                           
          x.tata(3)                                                                                                           
          ^^^^^^                                                                                                              
      AttributeError: 'toto' object has no attribute 'tata'                                                                    
       
      Si je met ma foncion tata en colonne 5 comme __init__, ça marche.
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        18 janvier 2023 à 9:20:02

        Mettre le mot clé global dans une classe est contre productif. Il serait plus adapté d'ajouter un paramètre dans la méthode, voir à la rigueur rendre accessible cette variable avec self.formule dans toute la classe.
        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

          18 janvier 2023 à 21:11:44

          Bonsoir,

          Merci à vous pour vos réponses.

          Je ne l'avais pas précisé mais je suis débutant.

          J'ai, je pense avoir insérer mon paramètre ' formule = "" ', du coup j'ai du mieux.

          Quand je clique sur l'un de mes boutons, le chiffre en question s'affiche dans le Entry. Mais mes chiffres ne s'ajoute pas les uns derrière les autres.

          Exemple: quand je clique sur le bouton "7", le "7" s'affiche bien dans mon Entry mais si je clique sur le "8", le "8" remplace le "7" etc.

          J'ai l'impression que l'ordre 'formule + str(num)' ne fonctionne pas, si j'ai bien compris le code bien sûr.

          J'ai testé plusieurs codes, en changeant les alignements, en insérant ma variable dans ma fonction.

          Voici le code qui ma donné le plus de satisfaction pour le moment dont l'exemple que j'ai cité ci-dessus est tiré.

          class LivRec(tk.Frame):
              def __init__(self, master):
                  tk.Frame.__init__(self, master)
          
          
                  def click_def(num,formule = ""): 
                      formule = formule + str(num) 
                      entrer_id.set(formule)
                      
                  def effacer(): 
                      entrer_id.set("")
                  
          
                  label_saisie = tk.Label(self,text="Saisir identifiant puis valider",font=("Times New Roman",20))
                  label_saisie.grid(column=0,columnspan=3,row=3,pady=5)
          
                  lframe = LabelFrame(self, width=400, height=400)
                  lframe.grid(column=0,columnspan=3,row=5)
          
                  entrer_id = tk.StringVar()
                  saisie_id = tk.Entry(lframe,textvariable=entrer_id, font=("Times New Roman",30),bd = 2,width=12)#,show="*")
                  saisie_id.grid(column=0,columnspan=3,row=0)
                  saisie_id.focus_set()
          
                  bouton7 = Button(lframe,text="7",width=5,command=lambda: click_def(7),font=("Times New Roman",40)).grid(column=0,row=1)
                  bouton8 = Button(lframe,text="8",width=5,command=lambda: click_def(8),font=("Times New Roman",40)).grid(column=1,row=1)
                  bouton9 = Button(lframe,text="9",width=5,command=lambda: click_def(9),font=("Times New Roman",40)).grid(column=2,row=1)
          
                  bouton4 = Button(lframe,text="4",width=5,command=lambda: click_def(4),font=("Times New Roman",40)).grid(column=0,row=2)
                  bouton5 = Button(lframe,text="5",width=5,command=lambda: click_def(5),font=("Times New Roman",40)).grid(column=1,row=2)
                  bouton6 = Button(lframe,text="6",width=5,command=lambda: click_def(6),font=("Times New Roman",40)).grid(column=2,row=2)
          
                  bouton1 = Button(lframe,text="1",width=5,command=lambda: click_def(1),font=("Times New Roman",40)).grid(column=0,row=3)
                  bouton2 = Button(lframe,text="2",width=5,command=lambda: click_def(2),font=("Times New Roman",40)).grid(column=1,row=3)
                  bouton3 = Button(lframe,text="3",width=5,command=lambda: click_def(3),font=("Times New Roman",40)).grid(column=2,row=3)
          
                  bouton_diese = Button(lframe,text="#",width=5,command=lambda: click_def("#"),font=("Times New Roman",40)).grid(column=0,row=4)
                  bouton0 = Button(lframe,text="0",width=5,command=lambda: click_def(0),font=("Times New Roman",40)).grid(column=1,row=4)
                  bouton_eff = Button(lframe,text="Effacer",width=5,command=effacer,font=("Times New Roman",40)).grid(column=2,row=4)
          
                  bouton_valider = tk.Button(self,text="Valider", font=("Times New Roman",40),command=lambda: master.switch_frame(PageLAC))
                  bouton_valider.grid(column=1,columnspan=2, row=6,pady=15)

          Merci encore pour vos retour



          -
          Edité par AnthonyGerbault1 18 janvier 2023 à 21:13:19

          • Partager sur Facebook
          • Partager sur Twitter
            18 janvier 2023 à 21:40:22

            On peut faire un peu plus simple je pense

            import tkinter as tk
            
            
            def button_pressed(number):
                e.delete(0, tk.END)
                e.insert(0, str(number))
            
            
            root = tk.Tk()
            root.title("Keyboard")
            
            e = tk.Entry(root)
            e.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
            
            button_list = [tk.Button(root, text=str(i), padx=40, pady=20, command=lambda i=i: button_pressed(i)) for i in range(10)]
            
            for i, button in enumerate(button_list):
                button.grid(row=(i // 3) + 1, column=i % 3)
            
            root.mainloop()
            



            -
            Edité par fred1599 18 janvier 2023 à 21:41:52

            • Partager sur Facebook
            • Partager sur Twitter

            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

              19 janvier 2023 à 11:37:11

              fred1599 a écrit:

              On peut faire un peu plus simple je pense

              import tkinter as tk
              
              
              def button_pressed(number):
                  e.delete(0, tk.END)
                  e.insert(0, str(number))
              
              
              root = tk.Tk()
              root.title("Keyboard")
              
              e = tk.Entry(root)
              e.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
              
              button_list = [tk.Button(root, text=str(i), padx=40, pady=20, command=lambda i=i: button_pressed(i)) for i in range(10)]
              
              for i, button in enumerate(button_list):
                  button.grid(row=(i // 3) + 1, column=i % 3)
              
              root.mainloop()
              


              Bonjour Fred1599,

              Je vous remercie de la solution que vous m'avez apporté.

              Ce qu'il me manquais était l'ordre "insert" comparé à mon code initial.

              j'ai adapté votre code a mon application pour que je puisse garder mes classes et mes positionnements.

              Maintenant mon code fonctionne parfaitement. Et il s'adapte complétement dans mon app complète.

              Comme je l'ai indiqué dans mes messages précédant, je suis un débutant et l'intéret pour moi, est de comprendre ce que j'écris même si ce n'est pas potentiellement dans la norme "python". Des améliorations seront effectuées au fur et à mesure pour rendre l'app plus lisible et potentiellement plus stable.

              Pour les personnes qui nous lisent, le code suivant fonctionne bien.

              Encore un grand merci de votre réponse !!!

              class LivRec(tk.Frame):
                  def __init__(self, master):
                      tk.Frame.__init__(self, master)
              
              
                      def click_def(num):
                          saisie_id.insert(99,str(num))
                      def effacer(): 
                          entrer_id.set("")
              
              
                      label_saisie = tk.Label(self,text="Saisir identifiant puis valider",font=("Times New Roman",20))
                      label_saisie.grid(column=0,columnspan=3,row=3,pady=10)
              
                      lframe = LabelFrame(self, width=400, height=400)
                      lframe.grid(column=0,columnspan=3,row=5)
              
                      entrer_id = tk.StringVar()
                      saisie_id = tk.Entry(lframe,textvariable=entrer_id, font=("Times New Roman",30),bd = 2,width=12)#,show="*")
                      saisie_id.grid(column=0,columnspan=3,row=0)
                      saisie_id.focus_set()
              
                      bouton7 = Button(lframe,text="7",width=5,command=lambda: click_def(7),font=("Times New Roman",40)).grid(column=0,row=1)
                      bouton8 = Button(lframe,text="8",width=5,command=lambda: click_def(8),font=("Times New Roman",40)).grid(column=1,row=1)
                      bouton9 = Button(lframe,text="9",width=5,command=lambda: click_def(9),font=("Times New Roman",40)).grid(column=2,row=1)
              
                      bouton4 = Button(lframe,text="4",width=5,command=lambda: click_def(4),font=("Times New Roman",40)).grid(column=0,row=2)
                      bouton5 = Button(lframe,text="5",width=5,command=lambda: click_def(5),font=("Times New Roman",40)).grid(column=1,row=2)
                      bouton6 = Button(lframe,text="6",width=5,command=lambda: click_def(6),font=("Times New Roman",40)).grid(column=2,row=2)
              
                      bouton1 = Button(lframe,text="1",width=5,command=lambda: click_def(1),font=("Times New Roman",40)).grid(column=0,row=3)
                      bouton2 = Button(lframe,text="2",width=5,command=lambda: click_def(2),font=("Times New Roman",40)).grid(column=1,row=3)
                      bouton3 = Button(lframe,text="3",width=5,command=lambda: click_def(3),font=("Times New Roman",40)).grid(column=2,row=3)
              
                      bouton_diese = Button(lframe,text="#",width=5,command=lambda: click_def("#"),font=("Times New Roman",40)).grid(column=0,row=4)
                      bouton0 = Button(lframe,text="0",width=5,command=lambda: click_def(0),font=("Times New Roman",40)).grid(column=1,row=4)
                      bouton_eff = Button(lframe,text="Effacer",width=5,command=effacer,font=("Times New Roman",40)).grid(column=2,row=4)
              
                      bouton_valider = tk.Button(self,text="Valider", font=("Times New Roman",40),command=lambda: master.switch_frame(PageLAC))
                      bouton_valider.grid(column=1,columnspan=2, row=6,pady=15)

              cdlt



              • Partager sur Facebook
              • Partager sur Twitter

              Class et Global

              × 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