双Python文件使用Tkinter时出现'module 'B' has no attribute 'view_note'错误的技术问询
解决Python循环导入+Tkinter模块属性不存在的问题
你在开发Tkinter程序时,用A.py和B.py两个文件配合,运行B.py却碰到了'module 'B' has no attribute 'view_note''的错误,咱们来一步步拆解问题,再给出修复方案。
问题根源分析
1. 循环导入导致模块加载异常
你的代码里A导入了B,B又导入了A,这是典型的循环导入问题。当Python加载B.py时,它会去导入A.py,而A.py又要导入B.py——这时候B模块还没完成全部初始化,导致后续调用B的内容时出现属性找不到的情况。
2. 属性访问路径错误
view_note是obj_2类的实例属性,它属于obj_2的某个具体对象,而不是B模块本身。你直接用b.view_note去访问,相当于找B模块的全局属性,自然会提示不存在。
修复方案
我们需要打破循环导入,同时修正属性的访问方式,让代码逻辑更清晰:
修改后的A.py
# 文件 >> A.py class obj_1: def __init__(self): print('obj_1 >> __init__') def obj_1_func_1(self, target_obj): print('obj_1 >> obj_1_func_1') # 通过传入的obj_2实例访问view_note属性 target_obj.view_note.set("Information Updating...")
修改后的B.py
# 文件 >> B.py from tkinter import * import tkinter as tk # 直接导入A中的obj_1类,避免模块级别的循环导入 from A import obj_1 class obj_2: def __init__(self): print('obj_2 >> __init__') self.view_note = StringVar() # 将root设为obj_2的实例属性,避免全局变量问题 self.root = Tk() self.root.title("TK TEST") self.root.geometry("150x100+10+8") n1 = tk.Label(self.root, textvariable=self.view_note, fg='black') n1.pack() self.obj_2_func_2() def display(self): self.view_note.set("Information Updating...") def obj_2_func_2(self): print('obj_2 >> obj_2_func_2') # 创建obj_1的实例,调用方法时传入当前obj_2的实例 obj1_instance = obj_1() obj1_instance.obj_1_func_1(self) if __name__ == '__main__': application = obj_2() application.root.mainloop()
关键修改点说明
- 打破循环导入:B.py直接从A导入
obj_1类,A.py不再导入B模块,而是通过方法参数接收obj_2的实例,彻底解决循环依赖问题。 - 修正属性访问:
obj_1_func_1通过传入的target_obj参数(也就是obj_2的实例)来访问view_note,这才是实例属性的正确访问方式。 - 规范全局变量:把
root从全局变量改成obj_2的实例属性,让代码的封装性更好,避免全局变量带来的潜在问题。
现在运行B.py,就能正常弹出窗口,标签会显示"Information Updating...",控制台也会打印对应的方法调用日志啦。
内容的提问来源于stack exchange,提问作者sonny
相关产品推荐
相关产品推荐

