拆分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
相关产品推荐
相关产品推荐

