2017-03-06 1 views
0

Ich versuche, ein Login-Programm zu machen, aber ich kann es nicht zum Laufen bringen.Meine Login-Seite funktioniert nicht

Wenn ich den Code ausführen und die richtigen Username und Password eintippen, sagt es falschen Eingang.

import tkinter 

window = tkinter.Tk() 
window.title('LoginPage') 

gebruikersnaam = 'Donald' 
wachtwoord = 'Trump' 

lblUsername = tkinter.Label(window,text='Username:') 
lblUsername.pack(fill=tkinter.X) 

entUsername = tkinter.Entry(window) 
entUsername.pack(fill=tkinter.X) 

lblPassword = tkinter.Label(window,text='Password:') 
lblPassword.pack(fill=tkinter.X) 

entPassword = tkinter.Entry(window) 
entPassword.pack(fill=tkinter.X) 

lblResult = tkinter.Label(window) 
lblResult.pack(fil=tkinter.X) 

def checkLogin(username,password): 

    if str(username) == gebruikersnaam and str(password) == wachtwoord: 
     lblResult.configure(text='Login was succesfull') 

    else: 
     lblResult.configure(text='Username or Password is wrong') 

btn = tkinter.Button(window,text='Login',command= lambda x=entPassword.get(), y=entUsername.get():checkLogin(y,x)) 

btn.pack(fill=tkinter.X) 

window.mainloop() 

Antwort

2

Gerade jetzt, Ihr Code ruft get() Methoden, sobald es ausgeführt wird, das ist, warum Sie leere Werte bekommen und „falsche Eingabe“.
Sie müssen get() Methoden ausführen, die nach dem Klicken der Schaltfläche ausgeführt werden, um dem Benutzer einige Zeit zu geben, einige Werte tatsächlich einzugeben.

So sollten Sie Entry s als Parameter übergeben und get() Methoden innerhalb von Lambda aufrufen.

btn = tkinter.Button(..., command=lambda x=entUsername, y=entPassword: checkLogin(x.get(), y.get())) 

ABER, glaube ich, statt lambda, sollten Sie eine Wrapper-Funktion verwenden, die checkLogin aufruft. Das macht Ihren Code einfacher zu lesen und zu folgen.

def wrapperCheck(): 
    checkLogin(entUsername.get(), entPassword.get()) 

btn = tkinter.Button(window, text='Login', command=wrapperCheck) 
btn.pack(fill=tkinter.X) 

EDIT: Doch auch besserer Ansatz ist (dank von Bryan Oakley Kommentar), Entfernen von Parametern aus dem Verfahren und diese Werte in der es zu holen.

def checkLogin(): 
    username = entUsername.get() 
    password = entPassword.get() 
    #since get returns string objects you dont need str calls 
    if username == gebruikersnaam and password == wachtwoord: 
     lblResult.configure(text='Login was succesfull') 
    else: 
     lblResult.configure(text='Username or Password is wrong') 

    #also you can remove these temp values and directly compare like below 
    # entUsername.get() == gebruikersnaam and entPassword.get() == wachtwoord 

btn = tkinter.Button(window,text='Login',command= checkLogin) 
+0

Wow es funktioniert, vielen Dank für die schnelle und fantastische Unterstützung – SerialCoder

+0

noch besser ist es, die Verwendung von 'lambda' ganz zu entfernen. 'checkLogin' kann die Werte beim Aufruf einfach abrufen. –

+0

@Bryan A-ha! Keine Ahnung, warum ich dachte, ich würde hier einen Wrapper brauchen. Ich denke, nirgends ist vor dem Hirngespinst sicher. Vielen Dank. (jetzt bin ich auf Mobile, kann nicht richtig bearbeiten, wird bearbeiten, sobald ich kann) – Lafexlos