2017-05-02 10 views
0

我正在嘗試爲我的應用程序創建一個基本的日誌框架(不必擔心它的複雜性,它適用於A Level項目)。在checklogin函數中,我試圖檢索用戶輸入的用戶名,並查看它是否已經在數據庫中,並且會添加一些內容以檢查密碼是否與以後匹配。然而,我不斷收到錯誤'NameError:自由變量'userentry'之前引用封閉範圍內'。看看這個錯誤,它說通常的原因是因爲'userentry'正在被重新分配到相同的函數中。但是,我正在努力看到情況如何。任何幫助將不勝感激。獲取NameError:賦值之前引用的自由變量,但無法看到我已經完成的工作

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

在此代碼

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

變化command = check_login()command = check_login(沒有括號)。

check_login是函數對象。 check_login()調用函數對象並評估函數的返回值。

括號告訴Python立即調用函數。在此,當定義了tk.Button時,userentry變量尚未定義。這就是爲什麼當調用check_login時你得到NameError

因此,如果您使用command = check_login,那麼tk.Button會收到函數對象check_login,然後在按下按鈕時它可以稍後調用。

+0

啊,這是有道理的,惱人的事情如此之少可以擾亂你。謝謝,到下一個錯誤! – tdbridger

相關問題