2016-03-23 15 views
0

パスワード入力用のエントリウィジェット、パスワード検証用のハンドラ関数、検証結果の表示用のラベルウィジェットを使用しようとしています。ボタンlogin_btnがクリックされるたびにコードが、今、これまでに以下のようにパスワード検証のためのエントリウィジェットのTkinterイベントバインディング

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

私は方法verify_userによって検証するuser_namepwdを必要とする、結果はinst_lblに示されている(検証をトリガーします)。だからlogin_btnクリックイベントに応じてinst_lblverify_userにバインドするにはどうすればよいですか? user_namepwdの内容をverify_userで確認するにはどうすればよいですか?

答えて

1

self.プレフィックスを追加して、クラス変数にします。この方法で、作成されたメソッドの外部にアクセスすることができます。

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

これらを呼び出すときには、接頭辞self.も必要です。それ以外

self.inst_lbl.configure(...) 

それは、クラスのメンバーなので、あなたはverify_user方法でselfパラメータを必要とすることがあります。

また、Python-2.xではsuper(LoginFrame, self).__init__()TypeError: must be type, not classobjが表示されます。あなたがコメントアウトした行が正しいものです。あなたがsuper()を使用したい場合は

Frame.__init__(self, parent) 

、あなたがあるため、古いスタイルのクラスなどのクラスのdefinitonにパラメータとしてobjectを追加する必要があります

class LoginFrame(Frame, object): 
+0

クラス 'LoginFrame'が継承するため、' Frame'は、どのように使用しますこの場合は '__init __()'に 'super()'を正しく入れていますか? – daiyue

+0

'super()'でコードを実行しましたが、エラーは発生しませんでした。 – daiyue

+1

ええ、Python 2のためにそのエラーが発生しました。申し訳ありませんが、私はそれを言及する必要があります。 Python 2では、このようにLoginFrameのパラメータにオブジェクトを追加する必要があります。 'クラスLoginFrame(フレーム、オブジェクト)'。 Python 3では、正常に動作するはずです。 – Lafexlos

関連する問題