Partage
  • Partager sur Facebook
  • Partager sur Twitter

Enregistrer une variable dans un fichier texte...

Sujet résolu
    23 juillet 2011 à 19:47:16

    Salut les zéros!

    Voici ce code, qui génère un password quand l'user presse sur le bouton correspondant. Il y a aussi un compteur, et un bouton pour sauver le pass dans un fichir password.txt. Et c 'est là mon problème. Ca ne marche pas. Quand je clique sur le bouton Save, le fichier password.txt est créé, mais j'ai cette erreur en console: <gras>NameError: glbal name 'pass' is not defined. Pourtant, ma variable est bien déclarée (si je comprend bien l'erreur).

    Voici le code:

    import random
    from random import sample
    import string
    from Tkinter import *
    
    def dispp():
        global count
        passs=''.join(sample(liste,i))
        textt.insert(END, count)
        textt.insert(END, '- ')
        textt.insert(END, passs+'\n')
        
        count += 1
        v.set(count)
    
    def save():
        filee=open('password.txt', 'a')
        filee.write(passs)
        filee.close()
    
    window=Tk()
    
    liste=string.ascii_letters+string.digits+string.punctuation
    i=20
    count=0
    v=StringVar()
    
    bar=Scrollbar(window)
    bar.pack(side=RIGHT, fill=Y)
    
    window.maxsize(width=500, height=200)
    window.minsize(width=500, height=200)
    window.title("Python window")
    window.resizable(height=NO, width=NO)
    
    textt=Text(window, height=5, width=40, yscrollcommand=bar.set)
    textt.pack()
    button=Button(window, text='Generate password', command=dispp)
    button.pack()
    button_save=Button(window, text='Save this password', command=save)
    button_save.pack()
    Label(window, text='Number of passwords generated: ').pack()
    Label(window, textvariable=v).pack()
    
    bar.config(command=textt.yview)
    
    window.mainloop()
    


    Voyez-vous le problème? Avez-vous des idées pour l'améliorer?
    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      23 juillet 2011 à 21:04:03

      Normal, à la fin de la fonction dispp(), la variable passs est détruite. La fonction save() ne peut donc pas y accéder.
      • Partager sur Facebook
      • Partager sur Twitter
        23 juillet 2011 à 21:52:28

        Le plus simple :

        Modifie la fonction dispp pour retourner passs et v (comme l'a dit JAlon ces variables sont détruites à la fin de la fonction).

        Modifie les fonctions dispp et save pour accepter en paramètrse les variables dont elles ont besoin (ça t'évitera de les déclarer en global).
        • Partager sur Facebook
        • Partager sur Twitter
          23 juillet 2011 à 21:52:56

          Et comment faire alors? Je ne vois pas ce qui la supprime...

          Comment la garder en vie ? :p

          EDIT: J'ai réussi à enregistrer le dernier pass généré dans password.txt, en modifiant selon vos conseils la fonction dispp:

          def dispp():
              global count
              passs=''.join(sample(liste,i))
              global passs
              textt.insert(END, count)
              textt.insert(END, '- ')
              textt.insert(END, passs+'\n')
              
              count += 1
              v.set(count)
          


          Cependant, j'ai quelques avertissements: name 'passs' is asigned to be for global declaration.

          Des avis?
          Merci en tout cas :) .
          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2011 à 22:02:14

            Déclare la global avant comme ceci : :)


            def dispp():
                global count
                global passs
                passs=''.join(sample(liste,i))
                textt.insert(END, count)
                textt.insert(END, '- ')
                textt.insert(END, passs+'\n')
                
                count += 1
                v.set(count)
            
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              23 juillet 2011 à 22:08:13

              La meilleure solution c'est de se mettre à la POO, sinon les globals sont inévitables et sources d'erreur.

              ça ferait un truc de ce genre

              from tkinter import *
              import string
              from random import sample
              
              class Bouton(Button):
                  def __init__(self, nom, callback):
                      Button.__init__(self, text=nom, command=callback)
                      self.pack()
              
              class Fen(Tk):
                  def __init__(self, master=None):
                      Tk.__init__(self)
                      self.liste = string.ascii_letters+string.digits+string.punctuation
                      self.i = 20
                      self.count = 0
                      self.v = StringVar()
                      self.maxsize(width=500, height=200)
                      self.minsize(width=500, height=200)
                      self.title("Python window")
                      self.resizable(height=NO, width=NO)
                      self.bar = Scrollbar(self).pack(side=RIGHT, fill=Y)
                      self.t = Text(self, height=5, width=40)
                      self.t.pack()
                      Label(self, text='Number of passwords generated: ').pack()
                      Label(self, textvariable=self.v).pack()
                      Bouton('Generate password', self.dispp)
                      Bouton('Save this password', self.save)
                  def dispp(self):
                      self.passs=''.join(sample(self.liste,self.i))
                      self.t.insert(END, self.count)
                      self.t.insert(END, '- ')
                      self.t.insert(END, self.passs+'\n')
                      self.count += 1
                      self.v.set(self.count)
                  def save(self):
                      filee=open('password.txt', 'a')
                      filee.write(self.passs)
                      filee.close()
              
              ma_fen = Fen('root')
              ma_fen.mainloop()
              


              Bon j'ai fais ça en vitesse parce-que j'avais un peu de temps, mais c'est dans l'idée, et c'est fonctionnel, qui puis est sans globals
              • Partager sur Facebook
              • Partager sur Twitter

              Enregistrer une variable dans un fichier texte...

              × 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