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

拆分Tkinter多文件应用,运行main.py报NameError: name 'root' is not defined

解决Tkinter拆分文件后回车键绑定的NameError问题

问题原因

运行main.py时,login_page.py中LoginInfo类的__init__方法直接使用root变量,但该变量仅在login_page.py自身的if __name__ == "__main__"代码块中定义,被main.py导入时此变量不存在,因此抛出NameError。

解决方案

无需依赖全局的root变量,Tkinter控件可通过winfo_toplevel()方法获取所在的顶级窗口(即根窗口),同时为login方法的event参数设置默认值,兼容按钮点击和回车键触发两种场景:

修改后的login_page.py完整代码:

import tkinter as tk
class LoginInfo(tk.Frame):
   def __init__(self, parent, *args, **kwargs):
       tk.Frame.__init__(self, parent, *args, **kwargs)

       self.login_frame = tk.Frame(self)
       self.login_frame.pack()

       self.username_label = tk.Label(self.login_frame, text='Username:')
       self.username_label.grid(row=0, column=0, padx=(10,0), pady=(10,0))

       self.username_entry = tk.Entry(self.login_frame)
       self.username_entry.grid(row=0, column=1, padx=(10,0), pady=(10,0))

       self.password_label = tk.Label(self.login_frame, text='Password:')
       self.password_label.grid(row=1, column=0, padx=(10,0), pady=(10,0))

       self.password_entry = tk.Entry(self.login_frame)
       self.password_entry.grid(row=1, column=1, padx=(10,0), pady=(10,0))

       self.login_button = tk.Button(self.login_frame, text='Login', command=self.login)

       self.login_button.grid(row=2, column=0, columnspan=2, pady=20)
       # 通过控件自身获取顶级窗口并绑定回车键
       self.winfo_toplevel().bind('<Return>', self.login)

   def login(self, event=None):
       # 给event设默认值,兼容按钮点击(无参数)和回车键触发(带event参数)
       print('Logged In')

if __name__ == "__main__":
   root = tk.Tk()
   LoginInfo(root).pack(side="top", fill="both", expand=True)
   root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:35:32