Tkinter Entry值获取异常:注册表单Entry值打印为空求助
问题原因及解决方法
问题根源
你创建注册窗口时用了Tk(),这会生成一个全新的Tcl解释器实例,而全局定义的uservals和passwords这两个StringVar是绑定在主窗口(第一个Tk()实例)的解释器上的,新窗口的Entry组件无法和这些全局StringVar正确关联,导致获取到空值。
解决步骤
把注册窗口的Tk()替换成Toplevel(),它是主窗口的子窗口,共享同一个Tcl解释器,这样全局的StringVar就能正常和新窗口的Entry绑定:
修改后的完整代码:
from tkinter import * from tkinter import messagebox as msg root = Tk() users = {'pawan': '123'} userval = StringVar() password = StringVar() uservals = StringVar() passwords = StringVar() def submitForm(): if userval.get() in users: root.destroy() main = Tk() main.geometry("200x200") else: msg.showinfo(message='Invalid User or Password') print(users) def signupForm(): print(uservals.get()) print(passwords.get()) # 可添加注册逻辑,比如将新用户存入字典 # users[uservals.get()] = passwords.get() root.geometry("655x333") root.title("Library") tframe = Frame(root, bg="black") tframe.pack(side="top", fill="both") heading = Label(tframe, text="Welcome to Our library", bg="red", borderwidth=12).pack() fframe = Frame(root, width=400, height=200) fframe.pack() user = Label(fframe, text="Username").grid() passw = Label(fframe, text="Password").grid(row=1, column=0) userin = Entry(fframe, textvariable=userval) userin.grid(row=0, column=1) passwin = Entry(fframe, textvariable=password, show="*") passwin.grid(row=1, column=1) loginb = Button(fframe, text='Login', command=submitForm).grid(row=3, column=0) def signup(): # 替换Tk()为Toplevel,绑定主窗口root sign = Toplevel(root) sign.geometry("400x200") Label(sign, text="Enter Email").grid() Label(sign, text="Enter Password").grid(row=1, column=0) si = Entry(sign, textvariable=uservals) si.grid(row=0, column=1) Entry(sign, textvariable=passwords, show="*").grid(row=1, column=1) Button(sign, text='Signup', command=signupForm).grid(row=3, column=0) Button(fframe, text='Signup', command=signup).grid(row=3, column=1) root.mainloop()
额外优化建议
- 注册成功后可清空输入框:在
signupForm中添加uservals.set("")和passwords.set("") - 增加输入验证逻辑,比如检查用户名/密码是否为空、密码长度是否达标等
- 避免过度使用全局变量,后续可将UI逻辑封装为类,提升代码可维护性
内容的提问来源于stack exchange,提问作者pawankvip
相关产品推荐
相关产品推荐

