文本检索中的属性错误

时间:2017-10-09 12:28:52

标签: python tkinter

在我的课程中取得进展后,我遇到了另一个障碍,因为存在我无法解决的属性错误。我正在尝试检索用户为其帐户凭据输入的信息,以便可以将数据与我拥有的数据库中的信息进行比较,并且可以授予或拒绝用户访问帐户,即登录屏幕。 错误是:

AttributeError: 'LogInScreen' object has no attribute 'usernameEntry'

这来自的代码是:

class LogInScreen(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        description = tk.Label(self, text="Please log in to gain access to the content of this computer science program.", font=LARGE_FONT)
        description.pack()

        label1 = tk.Label(self, text="Enter your username:")
        label1.pack()

        usernameEntry = tk.Entry(self)
        usernameEntry.pack()

        label2 = tk.Label(self, text="Enter your password:")
        label2.pack()


        passwordEntry = tk.Entry(self, show="*")
        passwordEntry.pack()

        notRecognised=tk.Label(self, text="")

        logInButton = tk.Button(self, text="Log In",
                                command=self.logUserIn)
        logInButton.pack()

        self.controller = controller

    def logUserIn(self):
        username = self.usernameEntry.get()
        password = self.passwordEntry.get()

        find_user = ("SELECT * FROM user WHERE username == ? AND password == ?")
        cursor.execute(find_user,[(username),(password)])
        results = cursor.fetchall()

我不确定为什么我会收到错误,我已经要求班上的其他人帮忙,但我没有走得太远。我知道它可能非常简单,但我自己无法解决它。感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:1)

您发出此错误AttributeError: 'LogInScreen' object has no attribute 'usernameEntry'是因为您尚未将usernameEntry定义为类属性。因此,当您对程序进行初始化时,它将创建小部件,但是任何东西都无法从__init__之外与它进行交互。

如果类中的方法需要与方法外部的变量交互或者从类实例外部进行交互,则需要将变量指定为具有前缀self.的属性

您需要做的就是改变这一点:

usernameEntry = tk.Entry(self)
usernameEntry.pack()

passwordEntry = tk.Entry(self, show="*")
passwordEntry.pack()

对此:

self.usernameEntry = tk.Entry(self)
self.usernameEntry.pack()

self.passwordEntry = tk.Entry(self, show="*")
self.passwordEntry.pack()

答案 1 :(得分:0)

在方法logUserIn(self)中,您尝试访问未定义的属性self.usernameEntry

__init__()中,您有一个名为usernameEntry的变量,但此变量不是属性。您可能希望将self.usernameEntry = usernameEntry添加到__init__方法,以将该变量转换为可由logUserIn访问的属性吗?

BTW对passwordEntry来说是一样的。