2016-03-23 31 views
0

Ich versuche, ein Eingabe-Widget für die Passworteingabe, eine Handler-Funktion für die Passwortverifizierung und ein Label-Widget für die Anzeige des Ergebnisses der Überprüfung zu verwenden. Der Code ist wie folgt bisherTkinter Event Binding des Eingabe-Widget für die Passwort-Verifizierung

class LoginFrame(Frame): 
    def __init__(self, parent): 
     #Frame.__init__(self, parent) 
     super(LoginFrame, self).__init__() 

     self.parent = parent   
     self.initUI() 

    # initialize the login screen UI 
    def initUI(self): 
     # Set up login frame properties 
     self.parent.title("Login Screen") 

     # creating instruction label 
     inst_lbl = self.make_label(self.parent, "Please login to continue") 

     # creating labels and entries for user name and password 
     user_name = self.make_entry(self.parent, caption="User Name:") 
     pwd = self.make_entry(self.parent, caption="User Password:", show="*") 

     # create a login button 
     login_btn = self.make_button(self.parent, self.verify_user, "Login")   


    # create a button 
    #---------------------------------------------------------------------- 
    def make_button(self, parent, command, caption=NONE, side=TOP, width=0, **options): 
    """make a button""" 
     btn = Button(parent, text=caption, command=command) 

     if side is not TOP: 
      btn.pack(side=side) 
     else: 
      btn.pack()  

     return btn 


    def make_label(self, parent, caption=NONE, side=TOP, **options): 
     label = Label(parent, text=caption, **options) 

     if side is not TOP: 
      label.pack(side=side) 
     else: 
      label.pack() 

     return label 


    def make_entry(self, parent, caption=NONE, side=TOP, width=0, **options): 
     #Label(parent, text=caption).pack(side=LEFT) 
     self.make_label(self.parent, caption, side) 
     entry = Entry(parent, **options) 
     if width: 
      entry.config(width=width) 
     if side is not TOP: 
      entry.pack(side=side) 
     else: 
      entry.pack() 

     return entry   


    # verify user name and password 
    #---------------------------------------------------------------------- 
    def verify_user(event): 
     """verify users""" 
     if user_name.get() == "admin" and pwd.get() == "123": 
      #inst_lbl.configure(text="User verified") 
      event.widget.config(text="User verified") 
     else: 
      #inst_lbl.configure(text="Access denied. Invalid username or password") 
      event.widget.config(text="Access denied. Invalid username or password") 


def main(): 
    top = Tk()  
    app = LoginFrame(top) 
    top.mainloop() 


if __name__ == '__main__': 
    main() 

jetzt, ich brauche user_name und pwd durch das Verfahren verify_user verifiziert werden, wobei das Ergebnis in inst_lbl gezeigt wird, wenn die Schaltfläche login_btn geklickt wird (die Überprüfung auszulösen). So, wie inst_lbl zu verify_user, in Reaktion auf die login_btn Click-Ereignis zu binden? und wie man den Inhalt von user_name und pwd in verify_user verifiziert bekommen?

Antwort

1

Machen Sie sie Klassenvariable, indem Sie self. Präfixe hinzufügen. Auf diese Weise können Sie auf sie außerhalb der Methode zugreifen, in der sie erstellt wurden.

self.inst_lbl = self.make_label(...) 
self.user_name = self.make_entry(...) 
self.pwd = self.make_entry(...) 

Beim Versuch, sie zu nennen, müssen Sie auch self. Präfixe.

self.inst_lbl.configure(...) 

Other than that, werden Sie self Parameter in verify_user Verfahren werden benötigt, da es sich um ein Mitglied einer Klasse ist.

Auch für Python-2.x erhalten Sie TypeError: must be type, not classobj auf Ihrem super(LoginFrame, self).__init__(). Die Zeile, die Sie auskommentiert haben, ist die richtige, die Sie verwenden können.

Frame.__init__(self, parent) 

Wenn Sie super() verwenden möchten, sollten Sie object als Parameter Ihrer Klasse definiton hinzufügen, weil der alte Stil Klassen usw.

class LoginFrame(Frame, object): 
+0

seit Klasse '' LoginFrame' erbt Frame', wie zu nutzen 'super()' richtig in '__init __()' für diesen Fall? – daiyue

+0

Ich führe den Code mit 'super()', aber es wurde kein Fehler generiert. – daiyue

+1

Ja, dieser Fehler ist wegen Python 2 aufgetreten. Tut mir leid, ich sollte es erwähnen. Für Python 2 müssen Sie den Parametern von LoginFrame so ein Objekt hinzufügen. 'class LoginFrame (Rahmen, Objekt)'. Für Python 3 sollte es gut funktionieren. – Lafexlos

Verwandte Themen