You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter登录系统注册功能报错:NameError: Usrfield未定义

Tkinter登录系统注册功能报错:NameError: name 'Usrfield' is not defined

我正在开发基于Tkinter的用户登录系统,需求是用户点击注册按钮后,将输入的用户名和密码追加写入对应文件。但由于Entry字段(Usrfield、Pswrdfield)是在点击注册时触发的addattrs函数内创建的,调用createusr函数获取输入内容时出现报错:

usr = (Usrfield).get()
NameError: name 'Usrfield' is not defined

原代码如下:

from tkinter import *
from tkinter import messagebox
Homescreen = Tk()

def addattrs():
    Signup = Tk()
    Usrfield = Entry(Signup, width=50)
    #Usrfield = signupinput.get(1.0, "end-1c") c
    Usrfield.insert(0, "What is ur usr")
    Usrfield.pack()
    Pswrdfield = Entry(Signup, width=50)
    Pswrdfield.insert(0, "Password?")
    Pswrdfield.pack()
    Homescreen.withdraw()
    loginbtn = Button(Signup, text="sign up", command=createusr)
    loginbtn.pack()

def login():
   Login= Toplevel(Homescreen)
   Login.geometry("750x250")
   Login.title("New Window")
   Label(Login, text="Youve logged in?", font=('Helvetica 17 bold')).pack(pady=30)
   Homescreen.withdraw()

def signup():
  #create window

  Homescreen.withdraw()
  addattrs()
def createusr():
    usr = (Usrfield).get()
    password = Pswrdfield.get()

    with open("Usernames.txt", "a+") as usrs:
        usrs.write(usr)
        usrs.write("\n")
    with open("Passwords.txt", "a+") as pswrds:
        pswrds.write(password)
        pswrds.write("\n")


#Create a label
Label(Homescreen, text= "Click the below button to Open a New Window", font= ('Helvetica 17 bold')).pack(pady=30)
#Create a button to open a New Window
to_login = Button(Homescreen, text="Login", command=login).pack()
to_signup = Button(Homescreen, text="Sign up", command=signup).pack()


Homescreen.mainloop()

我曾尝试在原窗口关闭后定义新窗口,但程序在代码执行前就停止运行了。


问题原因

  1. Usrfield和Pswrdfield是addattrs函数内的局部变量,createusr函数无法跨函数访问局部变量,导致NameError。
  2. Tkinter程序应仅创建一个主窗口Tk(),注册窗口使用Toplevel()而非新的Tk(),否则会引发多主循环冲突。

解决方法

方法一:使用全局变量

将Entry变量声明为全局变量,让createusr能访问到:

from tkinter import *
from tkinter import messagebox
Homescreen = Tk()

# 初始化全局变量
Usrfield = None
Pswrdfield = None

def addattrs():
    global Usrfield, Pswrdfield
    # 用Toplevel创建注册窗口,避免多主窗口问题
    Signup = Toplevel(Homescreen)
    Usrfield = Entry(Signup, width=50)
    Usrfield.insert(0, "What is ur usr")
    Usrfield.pack()
    Pswrdfield = Entry(Signup, width=50)
    Pswrdfield.insert(0, "Password?")
    Pswrdfield.pack()
    Homescreen.withdraw()
    loginbtn = Button(Signup, text="sign up", command=createusr)
    loginbtn.pack()

def login():
   Login= Toplevel(Homescreen)
   Login.geometry("750x250")
   Login.title("New Window")
   Label(Login, text="Youve logged in?", font=('Helvetica 17 bold')).pack(pady=30)
   Homescreen.withdraw()

def signup():
    Homescreen.withdraw()
    addattrs()

def createusr():
    global Usrfield, Pswrdfield
    usr = Usrfield.get()
    password = Pswrdfield.get()

    with open("Usernames.txt", "a+") as usrs:
        usrs.write(usr + "\n")
    with open("Passwords.txt", "a+") as pswrds:
        pswrds.write(password + "\n")
    
    # 注册完成后关闭注册窗口,恢复主窗口
    Usrfield.master.destroy()
    Homescreen.deiconify()


Label(Homescreen, text= "Click the below button to Open a New Window", font= ('Helvetica 17 bold')).pack(pady=30)
to_login = Button(Homescreen, text="Login", command=login).pack()
to_signup = Button(Homescreen, text="Sign up", command=signup).pack()

Homescreen.mainloop()

方法二:类封装(更推荐)

用类管理界面元素,避免全局变量,代码结构更清晰:

from tkinter import *
from tkinter import messagebox

class LoginSystem:
    def __init__(self):
        self.Homescreen = Tk()
        self.setup_home_screen()

    def setup_home_screen(self):
        Label(self.Homescreen, text= "Click the below button to Open a New Window", font= ('Helvetica 17 bold')).pack(pady=30)
        Button(self.Homescreen, text="Login", command=self.login).pack()
        Button(self.Homescreen, text="Sign up", command=self.signup).pack()
        self.Homescreen.mainloop()

    def login(self):
        Login = Toplevel(self.Homescreen)
        Login.geometry("750x250")
        Login.title("New Window")
        Label(Login, text="Youve logged in?", font=('Helvetica 17 bold')).pack(pady=30)
        self.Homescreen.withdraw()

    def signup(self):
        self.Homescreen.withdraw()
        self.addattrs()

    def addattrs(self):
        self.Signup = Toplevel(self.Homescreen)
        self.Usrfield = Entry(self.Signup, width=50)
        self.Usrfield.insert(0, "What is ur usr")
        self.Usrfield.pack()
        self.Pswrdfield = Entry(self.Signup, width=50)
        self.Pswrdfield.insert(0, "Password?")
        self.Pswrdfield.pack()
        Button(self.Signup, text="sign up", command=self.createusr).pack()

    def createusr(self):
        usr = self.Usrfield.get()
        password = self.Pswrdfield.get()

        with open("Usernames.txt", "a+") as usrs:
            usrs.write(usr + "\n")
        with open("Passwords.txt", "a+") as pswrds:
            pswrds.write(password + "\n")
        
        self.Signup.destroy()
        self.Homescreen.deiconify()

if __name__ == "__main__":
    LoginSystem()

内容的提问来源于stack exchange,提问作者Rlver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:10:17