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()
我曾尝试在原窗口关闭后定义新窗口,但程序在代码执行前就停止运行了。
问题原因
Usrfield和Pswrdfield是addattrs函数内的局部变量,createusr函数无法跨函数访问局部变量,导致NameError。- 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
相关产品推荐
相关产品推荐

