2017-10-09 4 views
0

Après avoir progressé dans mes cours j'ai franchi un autre barrage dans le fait qu'il y a une erreur d'attribut que je suis incapable de résoudre. J'essaie de récupérer les informations que l'utilisateur a saisies pour leurs informations d'identification de compte afin que les données puissent être comparées aux informations de la base de données et que l'utilisateur peut se voir accorder ou refuser l'accès au compte, par exemple un écran de connexion. L'erreur est:erreur d'attribut dans la récupération de texte

AttributeError: 'LogInScreen' object has no attribute 'usernameEntry'

Et le code où cela vient est:

class LogInScreen(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     description = tk.Label(self, text="Please log in to gain access to the content of this computer science program.", font=LARGE_FONT) 
     description.pack() 

     label1 = tk.Label(self, text="Enter your username:") 
     label1.pack() 

     usernameEntry = tk.Entry(self) 
     usernameEntry.pack() 

     label2 = tk.Label(self, text="Enter your password:") 
     label2.pack() 


     passwordEntry = tk.Entry(self, show="*") 
     passwordEntry.pack() 

     notRecognised=tk.Label(self, text="") 

     logInButton = tk.Button(self, text="Log In", 
           command=self.logUserIn) 
     logInButton.pack() 

     self.controller = controller 

    def logUserIn(self): 
     username = self.usernameEntry.get() 
     password = self.passwordEntry.get() 

     find_user = ("SELECT * FROM user WHERE username == ? AND password == ?") 
     cursor.execute(find_user,[(username),(password)]) 
     results = cursor.fetchall() 

Je ne suis pas sûr de savoir pourquoi je reçois l'erreur et j'ai demandé d'autres personnes dans ma classe pour l'aide mais je ne vais pas très loin. Je suis conscient que c'est probablement quelque chose de très simple mais je ne peux pas le résoudre moi-même. Merci pour toute aide que vous pouvez donner.

Répondre

1

La sortie de cette erreur AttributeError: 'LogInScreen' object has no attribute 'usernameEntry' est due au fait que vous n'avez pas défini usernameEntry comme attribut de classe. Ainsi, lorsque vous initialisez le programme, il créera les widgets mais rien ne pourra interagir avec lui depuis l'extérieur de __init__.

Si une méthode dans la classe a besoin d'interagir avec les variables en dehors de la méthode ou d'interagir à l'extérieur de votre instance de classe les variables doivent être attribuées comme un attribut avec le préfixe self.

Tout ce que vous devez faire est de changer ceci:

usernameEntry = tk.Entry(self) 
usernameEntry.pack() 

passwordEntry = tk.Entry(self, show="*") 
passwordEntry.pack() 

à ceci:

self.usernameEntry = tk.Entry(self) 
self.usernameEntry.pack() 

self.passwordEntry = tk.Entry(self, show="*") 
self.passwordEntry.pack() 
0

Dans la méthode logUserIn(self), vous essayez d'accéder à un attribut self.usernameEntry qui n'est pas défini.

Dans __init__() vous avez une variable nommée usernameEntry, mais cette variable n'est pas un attribut. Peut-être que vous voulez ajouter self.usernameEntry = usernameEntry à la méthode __init__ pour transformer cette variable en attribut qui sera alors accessible par logUserIn?

Par ailleurs, il en sera de même pour passwordEntry.

+0

pourquoi voudriez-vous faire 'self.usernameEntry = usernameEntry'? Tout ce que vous avez à faire est d'ajouter 'self.' comme préfixe de' usernameEntry'. Il ne sert à rien de l'assigner comme vous l'avez suggéré. –

+0

@mike Bien sûr, vous pouvez, mais c'était plus facile d'expliquer de cette façon ... – Guillaume

+0

Je ne pense pas que dire à quelqu'un de faire quelque chose qui est considéré comme une mauvaise pratique est une bonne façon d'enseigner quelque chose. Vous dites de rendre 'usernameEntry' un attribut de classe que vous devez faire' self.usernameEntry = usernameEntry' ceci est trompeur et inexact. L'OP pensera qu'ils doivent faire cela pour tous les attributs de classe et cela va à l'encontre de la méthode de codage DRY et est une étape supplémentaire qui n'est pas nécessaire. –