Python 简单登录页面程序在Tkinter中产生属性错误

Python 简单登录页面程序在Tkinter中产生属性错误,python,tkinter,Python,Tkinter,所以,我正在使用tkinter开发一个简单的登录页面程序。基本上,它所做的只是检查给定的用户名和密码是否与常规python字典中的条目匹配。但是,当我尝试单击登录按钮时,会出现如下错误: File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__ return self.func(*args)

所以,我正在使用tkinter开发一个简单的登录页面程序。基本上,它所做的只是检查给定的用户名和密码是否与常规python字典中的条目匹配。但是,当我尝试单击登录按钮时,会出现如下错误:

  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "LoginRegister.py", line 26, in login
    if username_entry_login.get() in database:
AttributeError: 'NoneType' object has no attribute 'get'
这是我的密码:

from tkinter import *

root = Tk()

database = {
    "Username" : "123"
}

# Creating the login page
def login_page():
    global username_entry_login
    global password_entry_login

    login_screen = Tk()
    login_screen.title("Login")
    Label(login_screen, text="Username:").pack()
    username_entry_login = Entry(login_screen).pack()
    Label(login_screen, text="Password:").pack()
    password_entry_login = Entry(login_screen, show="*").pack()
    Button(login_screen, text="Login", command=login).pack()
    access_label = Label(login_screen, text="").pack()


# Creating the function for the login button
def login():
    if username_entry_login.get() in database:
        if database[username_entry_login.get()] == password_entry_login.get():
            access_label.config(text="Access Granted")
        else:
            access_label.config(text="Access Denied")
    else:
        access_label.config(text="Access Denied")

# Creating the main page
Button(text="Login", command=login_page).pack()

root.mainloop()

如何避免此错误?

出现此错误的原因是在输入框上调用了.pack方法,结果存储在没有.get方法的username\u Entry\u login中。您可以将.pack与小部件的创建分开,也可以使用称为[]的特殊文本小部件

选项1-将.pack方法与条目小部件的初始化分离

比如:

username_entry_login = Entry(login_screen)
username_entry_login.pack()
username_entry_login.get() # returns the the contents of the username entry box
username_strvar = StringVar()
Entry(login_screen, textvariable=username_strvar).pack()
选项2-字符串变量

比如:

username_entry_login = Entry(login_screen)
username_entry_login.pack()
username_entry_login.get() # returns the the contents of the username entry box
username_strvar = StringVar()
Entry(login_screen, textvariable=username_strvar).pack()
然后,您可以获取字符串变量的值,该值将作为字符串返回,即输入框的内容

因此:


是用户名\输入\登录一个字符串变量Tkinter输入小部件具有get函数。问题是username\u entry\u login是pack username\u entry\u login=Entrylogin\u screen.pack的结果,它不是entry的一个实例。哦,我的糟糕,修复了postah,明白了!非常感谢你!对于选项2,您不需要变量username\u entry\u login,因为它也是None。