2017-01-26 2 views
0

ユーザーが正しいパスワードを入力するまで実行される関数をtkinterに書く必要があります。原理的には、同じでなければなりません:python - リターンプレスで続行する許可を与える

check = input('type ok') 
while True: 
    if check == 'ok' 
     break 
    else: 
     check = input('type ok') 
print('You made it!') 

...しかし、いくつかのイライラの違いで:
1.私は、入力()関数を使用していないのではなく、Tkinterのテキストからテキストを取得しますウィジェット。
2.この検査方法は、単に一般的に物事が非常に不便になり、リターンキーを押し、にバインドされている
最高の私はこれまでのところ(擬似コードっぽいで)、持っている:

def authenticate(): 
    root.bind('<Return>', check) 
    if auth == True: 
     return 
    else: 
     root.after(500, authenticate) 

def check(): 
    if pword == correct_pword: 
     auth = True 

def signin(): 
    auth = False 
    authenticate() 
    print('you're signed in!') 

authenticateのみこの方法をユーザーがEnterキーを押してパスワードが正しいときに戻ります。私はそれがサインインのコードはその後だけ続くことを意味したと思ったが、これはどんな理由でもそうではないようだ。
これは正しいアプローチですか?関数が何かを返す前にコードがなぜ続くのかわかりません。

+0

シーケンシャルコード、途中でユーザの相互作用は、一般に、GUIで実行可能なアプローチではありません。代わりに、処理されるイベントに関して考える必要があります。あなたのプログラムが最初にやることは、関数にはじめてを束縛することです。プロセスはその機能を継続し、パスワードが間違っている場合はエラーを表示し、そうでない場合はパスワードフィールドを隠すことから始まる認証されたものを実行します。 – jasonharper

答えて

1

jasonharperさんのコメントによると、コマンドラインプログラムと同じように考えるべきではありません。特に、GUIのメインループはすでにGUIを提供しているため(GUIはキーボード入力、マウスクリックなどのイベントを待つため)、whileループは必要ありません。

したがって、パスワードのエントリを作成し、パスワードが正しいかどうかを確認する関数にReturnキーをバインドするだけで済みます。ユーザーが「Return」を押すたびに、関数が呼び出され、パスワードが正しい場合はログインウィンドウを破棄し、誤っている場合はエントリを消去します。

対応するコード:

import tkinter as tk 

def login(event): 
    pwd = entry.get() 
    if pwd == "ok": 
     print("You are logged in !") 
     root.destroy() 
    else: 
     entry.delete(0, "end") 

root = tk.Tk() 

entry = tk.Entry(root, show="*") 
entry.pack() 

entry.bind("<Key-Return>", login) 

root.mainloop() 
+0

ありがとうございます。私はこの方法を知っていましたが、私の場合、ユーザーはパスワードで物事を承認しなければならず、多くのコードがログインの中になければならないので、 )。しかし、これが唯一のものなら、私はそれを使うことができます – EriktheRed

+0

ログインに入れるコードがたくさんある場合は、login関数の中で呼び出されるいくつかの関数に分割することができます。 –

関連する問題