使用tkinter与runpy开发多文件登录页遇Label未定义错误求助
解决Tkinter中
Label未定义的错误 先看看你遇到的报错:
File "C:\Users\grond\Desktop\Very Good Things\main_account_screen().py", line 4, in <module> file_globals = runpy.run_path("Register_user().py") File "C:\Program Files (x86)\Python37-32\lib\runpy.py", line 263, in run_path pkg_name=pkg_name, script_name=fname) File "C:\Program Files (x86)\Python37-32\lib\runpy.py", line 96, in _run_module_code mod_name, mod_spec, pkg_name, script_name) File "C:\Program Files (x86)\Python37-32\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "Register_user().py", line 23, in <module> Label(register_screen, text="Registrazione avvenuta con successo", fg="green", font=("Lemon/Milk", 11)).pack NameError: name 'Label' is not defined
问题根源
- 模块独立导入问题:你在主文件里用了
from tkinter import *,但runpy.run_path运行的模块是独立的,不会继承主模块的导入。Register_user().py里直接用Label,但没自己导入tkinter组件,所以报错。 - 非法文件名:
Register_user().py和register().py这种带括号的文件名不符合Python模块命名规范,runpy可能无法正确识别文件。 - 代码小疏漏:
pack后面少了括号(.pack应该是.pack()),这会导致组件不会被渲染,就算解决了Label的问题,也看不到界面元素。 - 全局变量与函数调用问题:主文件里先调用了runpy,再定义
main_account_screen函数,逻辑顺序不对;注册按钮也没绑定正确的register函数。
一步步解决
1. 修正文件名
把Register_user().py改成register_user.py,register().py改成register.py,去掉文件名里的括号,确保模块能被正常导入。
2. 给子模块添加tkinter导入
在register_user.py开头加上:
from tkinter import *
这样模块里的Label、Button就能被识别了。
3. 修复代码逻辑与细节
- 主文件(
main_account_screen.py):不用runpy,直接导入子模块的函数,调整代码顺序(先创建窗口再添加按钮):
from tkinter import * import register import register_user def main_account_screen(): global main_screen main_screen = Tk() # 创建GUI窗口 main_screen.geometry("300x250") main_screen.title("Login") # GUI标题 # 表单标题 Label(text="Login o Registrati", bg="blue", width="300", height="2", font=("Lemon/Milk", 13)).pack() Label(text="").pack() # 登录按钮 Button(text="Login", height="2", width="30").pack() Label(text="").pack() # 注册按钮绑定register函数 Button(text="Registrati", height="2", width="30", command=register.register).pack() main_screen.mainloop() # 启动GUI main_account_screen() # 调用主函数
- register.py:把注册按钮绑定到
register_user.register_user函数,同时声明需要的全局变量:
from tkinter import * import register_user def register(): global main_screen global register_screen global username global password global username_entry global password_entry register_screen = Toplevel(main_screen) register_screen.title("Registrazione") register_screen.geometry("300x250") # 定义全局变量 username = StringVar() password = StringVar() Label(register_screen, text="Inserisci i dettagli qui sotto", bg="blue").pack() Label(register_screen, text="").pack() username_lable = Label(register_screen, text="Username * ") username_lable.pack() username_entry = Entry(register_screen, textvariable=username) username_entry.pack() password_lable = Label(register_screen, text="Password * ") password_lable.pack() password_entry = Entry(register_screen, textvariable=password, show='*') password_entry.pack() Label(register_screen, text="").pack() # 绑定注册按钮到register_user函数 Button(register_screen, text="Registrati", width=10, height=1, bg="blue", command=register_user.register_user).pack() def login_verification(): print("working...")
- register_user.py:补全
pack()的括号,同时确保login函数存在(可以自己定义或者从其他模块导入):
from tkinter import * def register_user(): global username global password global username_entry global password_entry global register_screen # 获取用户名和密码 username_info = username.get() password_info = password.get() # 用with语句更安全地操作文件 with open(username_info, "w") as file: file.write(username_info + "\n") file.write(password_info) # 清空输入框 username_entry.delete(0, END) password_entry.delete(0, END) # 显示成功提示,注意pack()要加括号 Label(register_screen, text="Registrazione avvenuta con successo", fg="green", font=("Lemon/Milk", 11)).pack() # 登录按钮,补全pack()括号 Button(register_screen, text="Login", height="2", width="30", command=login).pack() # 定义login函数,或者从register模块导入 def login(): print("Login initiated...")
这样调整后,你的登录注册界面应该能正常运行,不会再出现Label未定义的错误了。
内容的提问来源于stack exchange,提问作者Matteo Grondona
相关产品推荐
相关产品推荐

