2017-05-02 1 views
0

私のアプリケーション用の基本的なログインを作成しようとしています(複雑なことは気にせず、A Levelプロジェクト)。 checklogin関数では、ユーザが入力したユーザ名を取得しようとしています。データベースにすでに入っているかどうかを確認し、後でパスワードが一致するかどうかを確認するビットを追加します。しかし、私はエラー 'NameError:自由変数' userentry 'が囲みスコープ内で代入される前に参照され続ける。このエラーを見ると、通常の理由は、「userentry」が後で同じ機能に再割り当てされるためです。しかし、私はこれがどこにあるかを見るのに苦労しています。どんな助けもありがとう。このコードGetting NameError:代入前に参照されている空き変数ですが、どこで見たことがないかわかりません

loginbtn = tk.Button(self, 
        text="Log In", 
        fg="lightgreen", 
        bg="darkgreen", 
        height="3", 
        width="12", 
        command = check_login()) 

変化command = check_login()command = check_loginに(括弧なし)で

class Login(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     self.configure(background="lightgreen") 

    def check_login(): 
     sql = "SELECT Password FROM Player WHERE Username IN (?)" 
     parameters = (userentry.get()) 
     cursor.execute(sql, parameters) 
     print(cursor.fetchall()) 

    for col in range(5): 
     self.grid_columnconfigure(col, minsize=50) 

    for row in range(7): 
     self.grid_rowconfigure(row, minsize=60) 

    titlelbl = tk.Label(self, 
         text="Please enter your username and password", 
         font = "Verdana 20 bold", 
         fg="black", 
         bg="lightgreen") 

    titlelbl.grid(column=1, 
        row=0, 
        columnspan=3) 

    usernamelbl = tk.Label(self, 
          text="Username:", 
          font="Verdana 14", 
          bg="lightgreen") 

    usernamelbl.grid(column=1, 
        row=2) 

    passwordlbl = tk.Label(self, 
          text="Password:", 
          font="Verdana 14", 
          bg="lightgreen") 

    passwordlbl.grid(column=1, 
        row=4) 

    signupbtn = tk.Button(self, 
          text="Sign Up", 
          fg="lightgreen", 
          bg="darkgreen", 
          height="3", 
          width="12", 
          command = lambda: controller.show_frame("SignUp")) 

    signupbtn.grid(column=3, 
        row=6) 

    loginbtn = tk.Button(self, 
         text="Log In", 
         fg="lightgreen", 
         bg="darkgreen", 
         height="3", 
         width="12", 
         command = check_login()) 

    loginbtn.grid(column=1, 
        row=6) 

    userentry = tk.Entry(self) 

    userentry.grid(column=3, 
         row=2) 

    passentry = tk.Entry(self, 
         show="*") 

    passentry.grid(column=3, 
         row=4)      

答えて

0

check_loginは、関数オブジェクトです。 check_login()は、関数オブジェクトを呼び出し、関数の戻り値として評価します。

カッコは、関数をすぐに呼び出すようにPythonに指示します。ここで、tk.Buttonが定義されている場合、変数userentryはまだ定義されていません。このため、check_loginが呼び出されたときにNameErrorが表示されます。

を代わりに使用する場合、tk.Buttonは、関数オブジェクトcheck_loginを受け取ります。このオブジェクトは、ボタンが押されたときに後で呼び出すことができます。

+0

ああ、それは意味があります、あまりにも物事が少しあなたを混乱させる可能性があります。ありがとう、次のエラーに! – tdbridger

関連する問題