2017-10-16 7 views
0

ユーザーとパスワードが等しい場合にログインボタンをクリックすると、「ログイン成功/失敗」テキストが表示されます。関数のIf/else文が機能しない

私が抱えている問題は、ユーザーとパスワードが何であっても、失敗したメッセージの代わりに常に「成功」​​メッセージが表示されることです。

私は.getを使用して、ユーザーの入力を取得し、変数に保存しています。相続人

私のコード:

from tkinter import * 

root = Tk() 

label_name = Label(root, text="Username", fg="black") 
label_password = Label(root, text="Password", fg="black") 
input_name = Entry(root) 
name = input_name.get() 
input_password = Entry(root, show="*") 
password = input_password.get() 

label_name.grid(row=0, column=0, sticky=E) 
label_password.grid(row=1, column=0, sticky=E) 

input_name.grid(row=0, column=1) 
input_password.grid(row=1, column=1) 

checkbox = Checkbutton(root, text="Remember me") 
checkbox.grid(columnspan=2, sticky=W) 

login_button = Button(root, text="Login") 
login_button.grid(row=1, column=2) 


login_success = Label(root, text="Welcome", fg="black") 
login_fail = Label(root, text="login fail", fg="black") 


def login(event): 
    if name == password: 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_true = Label(root, text="Welcome", fg="black") 
     login_true.grid() 
    elif name != password: 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_false = Label(root, text="login fail", fg="black") 
     login_false.grid() 


login_button.bind("<Button-1>", login) 

root.mainloop() 

EDIT: は、私はまた、 "コマンド" 属性を使用しますが、同じ結果でした:

def login(): 
    name = input_name.get() 
    password = input_password.get() 
    if name == password: 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_true = Label(root, text="Welcome", fg="black") 
     login_true.grid() 
    elif name != password: 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_false = Label(root, text="login fail", fg="black") 
     login_false.grid() 


login_button = Button(root, text="Login", command=login) 
login_button.grid(row=1, column=2) 


root.mainloop() 

をEDIT2: は、新しい条件

を追加することによって修正されました
def login(): 

    if input_name.get() == "" or input_password.get() == "": 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_false = Label(root, text="login fail", fg="black") 
     login_false.grid() 
    elif input_name.get() == input_password.get(): 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_true = Label(root, text="Welcome", fg="black") 
     login_true.grid() 
    elif input_name.get() != input_password.get(): 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_false = Label(root, text="login fail", fg="black") 
     login_false.grid() 
+0

私はあなたを信じていません。その編集は私と他の1人のユーザーのために働きます。 2つのテキストボックスには何を入力していますか?彼らが違うなら、それは失敗しません。 –

+0

@EthanFieldはい私は間違っていました。今すぐ働いて、助けてくれてありがとう。 –

+0

Stack Exchangeで許可されていない "[SOLVED]"を削除する編集を提案しました。[理由はこちら](https://meta.stackexchange.com/a/116105/372286)を参照してください。 –

答えて

2

それは常にtrueを返す理由があります。 1つはコードの本体に、もう1つは機能内にありますlogin()namepasswordは、login()の両方とも、割り当てられた値を持たないので、両方ともNoneと同じです。彼らは常に平等であり、常にTrueを返すことを意味します。

変更以下の機能:<Button-1>ため.bind()を使用して

def login(): 
    if input_name.get() == input_password.get(): 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_true = Label(root, text="Welcome", fg="black") 
     login_true.grid() 
    elif input_name.get() != input_password.get(): 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_false = Label(root, text="login fail", fg="black") 
     login_false.grid() 

Buttonウィジェットにはひどいアイデアになる傾向があります。サイドノートでは

from tkinter import * 

root = Tk() 

def login(): 
    print("Login triggered") 

login_button = Button(root, text="Login", command=login) 
login_button.pack() 

root.mainloop() 

、あなたは同時に任意のパラメータを渡す必要がある場合は、:Buttonウィジェットがクリックされたときにコールバックを得ると呼ばれるために使用することができcommandと呼ばれる属性が組み込まれていますこれを行う最も簡単な方法は、Pythonの無名関数lambdaです。これは以下のように行うことができます:

from tkinter import * 

root = Tk() 

def login(variable): 
    print("Login triggered") 

login_button = Button(root, text="Login", command=lambda: login("variable")) 
login_button.pack() 

root.mainloop() 
+0

「コマンド」属性も使用しましたが、同じ結果が得られました。私はラムダを使用してその2番目のアプローチを見て、それを見たことはありません。 –

+1

@JoãoFróis下の2つのセクションは、今後の問題を修正するためのものです。なぜ私は答えの最上位で常に真実を返すのか説明しました。 –

1

私は決してtkinterを使用しませんでしたが、あなたはca guiを初期化している間にgetメソッドが呼び出されます。 (name = input_name.get()) 代わりに、ユーザーがloginメソッド内のボタンをクリックしたときにのみこれを呼び出す必要があります。あなたは2つのローカル名前空間にnamepasswordを宣言しているので、

from tkinter import * 

root = Tk() 

label_name = Label(root, text="Username", fg="black") 
label_password = Label(root, text="Password", fg="black") 
input_name = Entry(root) 
input_password = Entry(root, show="*") 

label_name.grid(row=0, column=0, sticky=E) 
label_password.grid(row=1, column=0, sticky=E) 

input_name.grid(row=0, column=1) 
input_password.grid(row=1, column=1) 

checkbox = Checkbutton(root, text="Remember me") 
checkbox.grid(columnspan=2, sticky=W) 

login_button = Button(root, text="Login") 
login_button.grid(row=1, column=2) 


login_success = Label(root, text="Welcome", fg="black") 
login_fail = Label(root, text="login fail", fg="black") 


def login(event): 
    name = input_name.get() 
    password = input_password.get() 
    if name == password: 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_true = Label(root, text="Welcome", fg="black") 
     login_true.grid() 
    elif name != password: 
     for widget in root.winfo_children(): 
      widget.grid_forget() 
     login_false = Label(root, text="login fail", fg="black") 
     login_false.grid() 


login_button.bind("<Button-1>", login) 

root.mainloop() 
+0

私はそれを試してみましたが、入力が何であっても同じ結果が得られました。 –

+0

私はちょうど簡単なチェックをしたし、私のためにそれは動作します。 –

+0

それは今働いている!私は何も書いていないので失敗するだろうと仮定してボックスに何も書き込まずにログインをクリックしていたのは馬鹿です。返信いただきありがとうございます。 –

関連する問題