首页 > 解决方案 > NameError:名称“屏幕”未定义

问题描述

我不断收到错误消息:

Traceback (most recent call last):
  File "C:\Users\name\Desktop\dice\login system.py", line 64, in <module>
    loginForm()
  File "C:\Users\name\Desktop\dice\login system.py", line 33, in loginForm
    screen1 = Toplevel(screen)
NameError: name 'screen' is not defined

这是一个学校项目,我首先必须制作一个登录系统,这可能与错误有关:

def main_screen():
    global screen
    global USERNAME
    global PASSWORD
    screen = Tk()
    screen.title('Name')
    screen.geometry("340x200")
        
    USERNAME = StringVar()
    PASSWORD = StringVar()

    Label(text = 'Welcome to Name', bg = 'grey', width = 300, height = 2, font = ('calibri', 12, 'bold')).pack()
    Label(text = '').pack()
    Button(text = 'Login', height = 2, width = 30, command = loginForm).pack()
    Label(text = '').pack()
    Button(text = 'Register', height = 2, width = 30, command = registerForm).pack()

    screen.mainloop()
def Database():
    global conn, cursor
    conn = sqlite.connect("db_member.db")
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS `member` (mem_id INTEGER PRIMARY KEY AUTINCREMENT NOT NULL, username TEXT, password TEXT)")

 def loginForm():
    global screen1, lbl_result1
    
    screen1 = Toplevel(screen)
    screen1.title('Login')
    screen1.geometry("400x400")

    lbl_title = Label(screen1, text = "Login", bg = 'grey', width = 50, height = 2, font = ('calibri', 12, 'bold'))
    lbl_title.pack()
    lbl_username = Label(screen1, text = "Username:", font = ('calibri', 25, 'bold'), bd = 18)
    lbl_username.pack()
    username = Entry(screen1, font = ('calibri', 20, 'bold'), textvariable = USERNAME, width = 15)
    username.pack()
    lbl_password = Label(screen1, text = "Password:", font = ('calibri', 25, 'bold'), bd = 18)
    lbl_password.pack()
    password = Entry(screen1, font = ('calibri', 20, 'bold'), textvariable = PASSWORD, width = 15, show = "*")
    password.pack()
    lbl_result1 = Label(screen1, text = "", font = ('calibri', 18, 'bold'))
    lbl_result1.pack()
    btn_login = Button(screen1, text = 'Login', font = ('calibri', 18), width = 25, command = login)
    btn_login.pack()

def login():
    Databse()
    if USERNAME.get() == "" or PASSWORD.get() == "":
        lbl_result1.config(text = 'Please complete all the fields', fg = 'orange')
    else:
        cursor.execute("SELECT * FROM `member` WHERE `username` = ? and `password` = ?", (USERNAME.get(), PASSWORD.get()))
        if cursor.fetchone() is not None:
            lbl_result1.config(text = 'You logged in successfully', fg = 'blue')
        else:
            lbl_result1.config(text = 'Invalid Username or Password', fg = 'red')
loginForm()

main_screen()

因为我已经完成了 def login():它一直说没有定义屏幕或者没有定义用户名和密码。

标签: pythontkinter

解决方案


global screen没有定义变量;它只是说该名称指的是一个名为的全局变量screen ,如果它存在的话。

问题是您在调用(实际上为 name 分配一个值)之前调用loginForm(它试图获取 的值) 。screenmain_screenscreen

但是,您不应该使用这么多全局变量。将值作为参数传递给函数,使用返回值,并考虑使用类来封装无法通过参数传递轻松共享的数据。


推荐阅读