2017-03-06 1 views
0

J'essaie de créer un programme de connexion, mais je n'arrive pas à le faire fonctionner.Ma page de connexion ne fonctionnera pas

Lorsque j'exécute le code et que je tape Username et Password, cela indique une mauvaise entrée.

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() 

Répondre

2

En ce moment, votre code appelle get() méthodes dès qu'il fonctionne, c'est la raison pour laquelle vous obtenez des valeurs vides et « mauvaise entrée ».
Vous devez exécuter les méthodes get() après avoir cliqué sur le bouton pour donner à l'utilisateur le temps de saisir certaines valeurs.

Donc, vous devriez passer Entry s comme paramètres et appeler get() méthodes à l'intérieur de lambda.

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

MAIS, je pense, au lieu de lambda, vous devez utiliser une fonction d'emballage, qui appelle checkLogin. Ce qui rend votre code plus facile à lire et à suivre.

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

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

EDIT: Cependant, l'approche est encore mieux (grâce à des commentaires de Bryan Oakley), supprimer des paramètres de votre méthode et récupérer ces valeurs à l'intérieur de celui-ci.

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 ça marche, je vous remercie beaucoup pour le soutien rapide et fantastique – SerialCoder

+0

encore mieux est de supprimer l'utilisation de 'lambda' tout à fait. 'checkLogin' peut facilement récupérer les valeurs quand il est appelé. –

+0

@Brian A-ha! Aucune idée de pourquoi je pensais avoir besoin d'un emballage ici. Je suppose que nulle part est sûr de brainfart. Merci. (maintenant je suis sur mobile, ne peut pas éditer correctement, éditera dès que possible) – Lafexlos