为什么即使导入,拼写和文件位置正确,我仍会收到AttributeError?

时间:2018-11-15 09:03:09

标签: python python-3.x attributeerror

  1. 我正在使用PyCharm
  2. 所有文件都位于“ venv”目录中

    • venv
    • NoteFunction.py
    • NoteMainApp.py
    • ...

我将代码分成五个单独的文件。一个“主”文件,收集所有其他文件并最终创建GUI。文件的前缀为'Note',后面加上适当的说明。

我现在的问题是将'NoteTopMenu'导入主文件'NoteMainApp'。 代码是:

import NoteStatusbar as SB
import NoteTopMenu as TM
import NoteWidgets as NW
import tkinter as tk


class MainApp(tk.Frame):

    def __init__(self, parent):

        tk.Frame.__init__(self,parent)
        super().__init__(parent)
        self.topbar = TM.TopMenu(parent)
        self.widget = NW.FrontFrames(parent)
        self.statusbar = SB.StatusBar(parent)


root = tk.Tk()
MainApp(root).pack(side="top", fill="both")

root.mainloop()

我收到错误消息:

Traceback (most recent call last):
  File "C:/Users/PycharmProjects/MindNotez/NoteMainApp.py", line 2, in <module>
    import NoteTopMenu as TM
  File "C:\Users\PycharmProjects\MindNotez\NoteTopMenu.py", line 2, in <module>
    import NoteMainApp as Main
  File "C:\Users\PycharmProjects\MindNotez\NoteMainApp.py", line 29, in <module>
    MainApp(root).pack(side="top", fill="both")
  File "C:\Users\PycharmProjects\MindNotez\NoteMainApp.py", line 13, in __init__
    self.topbar = TM.TopMenu(parent)

AttributeError:模块'NoteTopMenu'没有属性'TopMenu'

NoteTopMenu中的代码为:

import NoteMainApp as Main
import NoteWidgets as NW
import tkinter as tk


class TopMenu(NW.FrontFrames):
    """Class creating the top menu bar."""
    def __init__(self, master):
        super().__init__(master)
        # *******Top-Navigation Bar (tnb)**********
        tnb = tk.Menu(master)
        Main.root.config(menu=tnb)
        ....

如果我在主文件中注释掉NoteTopMenu,则代码运行不会出现问题。我检查了拼写,但PyCharm还为我提供了代码补全功能。因此,PyCharm会找到文件,模块,我的课程和其他模块,而不会出现问题。 您知道为什么找不到文件或模块或导入失败吗?

完整代码在GitHub上:MindNotez

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

您调用NoteMainApp.py,后者导入NoteTopMenu.py,后者导入NoteMainApp.py,而不是,然后继续导入NoteTopMenu.py(因为导入具有已经开始了)。然后,NoteMainApp.py的导入将继续分析文件的其余部分。此时已经定义了模块NoteTopMenu,但是它没有任何属性(因为还没有定义它们的属性)……因此出现了错误。

我建议NoteTopMenu.py不应导入NoteMainApp.py(并且如果两个文件都需要位,则应将它们移到两个都可以导入的文件中)