【问题标题】:Python: Import errors. Accessing method from other classPython:导入错误。从其他类访问方法
【发布时间】:2013-12-17 14:19:53
【问题描述】:

我遇到了以下问题:在我的主 tk 窗口中,我有一个按钮可以打开一个新的顶层窗口。单击 Toplevel 窗口上的按钮后,应将新元素添加到列表框。

我不断收到此错误消息:

Traceback (most recent call last):
  File "MainWindow.py", line 4, in <module>
    from TopWindow import TopWindow
  File "TopWindow.py", line 4, in <module>
    import MainWindow
  File "MainWindow.py", line 4, in <module>
    from TopWindow import TopWindow
ImportError: cannot import name TopWindow

我认为问题在于两个类相互导入。但是我不确定如何解决这个问题。有什么想法吗?

主窗口.py:

from TopWindow import TopWindow

class MainWindow:
    def __init__(self, mainWindow):
        self.value = ''
        self.gui(mainWindow)
    def gui(self, mainWindow):
        top = TopWindow()
        button = tk.Button(optionFrame, text="Open TopWindow", command=top.import)
        ...

    def addtolistbox(self):
        ....


mainWindow = tk.Tk()
run = MainWindow(mainWindow)
mainWindow.mainloop()

TopWindow.py

import MainWindow
class TopWindow:
    def import(self):
        ....
        MainWindow.MainWindow().addtolistbox()

【问题讨论】:

  • def import(self): 我认为这是你的问题。它应该是 __init__()
  • 命名选择是不是很有趣?

标签: python oop tkinter


【解决方案1】:

您创建了循环导入;当从TopWindow 导入MainWindow 时,TopWindow 类尚未定义,因此MainWindow 看到的TopWindow 模块没有该属性。

推迟TopWindow 类中的导入:

class TopWindow:
    def import(self):
        ....
        import MainWindow
        MainWindow.MainWindow().addtolistbox()

接下来,您每次都创建MainWindow 对象的新副本;您可能想要访问在 MainWindow.run 中创建的单例对象:

class TopWindow:
    def import(self):
        ....
        import MainWindow
        MainWindow.run.addtolistbox()

【讨论】:

  • 谢谢!这确实修复了导入错误。但是,现在我有一个不同的问题。通过调用 MainWindow.MainWindow().addtolistbox(),我创建了一个新的 Mainwindow,而不是仅仅更新现有窗口上的列表。我不想创建一个新的 MainWindow,而是在 MainWindow 中调用一个函数来更新现有的。我该怎么做?
  • 另外,新的 MainWindow 不再在 mainloop 中。我收到一个 TypeError: __init__() 正好需要 2 个参数(给定 1 个)
  • @user3111516:也许您想改用MainWindow.run.addtolistbox()?您已经在该模块中创建了主窗口对象。
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2019-05-19
相关资源
最近更新 更多