Tkinter规避循环导入时遇AttributeError:LoginInfo类无self属性
问题分析
错误AttributeError: type object 'LoginInfo' has no attribute 'self'是因为你错误地尝试从模块login_page中访问self——self是类实例的专属属性,不是模块或类本身的属性。同时你的代码存在循环导入问题(login_page导入page_one,page_one又导入login_page),这也是需要解决的隐患。
修复方案
1. 移除循环导入并正确传递实例引用
PageOne不需要导入login_page模块,因为创建PageOne时已经传入了LoginInfo的实例(作为parent参数),直接通过这个实例就能访问username_entry的值。
修改后的代码
page_one.py
import tkinter as tk class PageOne(tk.Frame): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) self.info() def info(self): # 通过parent访问LoginInfo实例的username_entry print(self.parent.username_entry.get())
login_page.py
为了彻底解决循环导入,把page_one的导入移到login函数内部(模块级导入会触发循环加载,函数内导入只有在调用时才执行):
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.login_button = tk.Button(self.login_frame, text='Login', command=self.login) self.login_button.grid(row=2, column=0, columnspan=2, pady=20) def login(self): # 移到函数内导入,避免循环导入 import page_one self.page_one = page_one.PageOne(self) self.page_one.pack(fill="both", expand='True') self.login_frame.destroy()
main.py
无需修改,保持原样即可。
关键说明
self.parent:在PageOne中,parent就是创建它时传入的LoginInfo实例(self),因此可以通过self.parent直接访问该实例的属性和方法。- 函数内导入:将
import page_one放在login方法内部,避免模块初始化阶段的循环导入问题,因为只有当用户点击登录按钮时才会执行这个导入。
内容的提问来源于stack exchange,提问作者Kome Gognome
相关产品推荐
相关产品推荐

