【问题标题】:Python - Access a function in a child classPython - 访问子类中的函数
【发布时间】:2015-05-28 16:02:01
【问题描述】:

我正在重写我的一个 Tkinter 程序,我想将逻辑和 UI 分成两个不同的文件:main.pyui.py

在 main 中,我们有一个类 MainApp(),它处理程序的所有核心功能。

在 ui 中,我们有一个类 BaseApp(),它负责渲染 UI 并执行所有这些操作。

我有BaseApp()MainApp() 的孩子,像这样:

ma​​in.py

class MainApp():
    def __init__(self):
    #some code here

ui.py

import main
class BaseApp(main.MainApp):
    def __init__(self):
        main.MainApp.__init__(self)
        #render UI here e.g...
        mybtn = tkinter.Button(self.root, text="Hey StackOverflow", command=main.myFunction)

这一切都很好。我在制作这个系统方面走了很长一段路,没有任何问题……然后我遇到了一个问题。

我希望能够从 main 调用 UI 代码。我需要main 模块中的MainApp() 类中的函数,以便能够显示弹出窗口并创建在ui 模块中的类中定义的Toplevel 窗口。

如果 MainApp() 派生自 BaseApp() 则我可以显示弹出窗口,但 UI 无法访问任何主要功能。如果 BaseApp() 如上所述从 MainApp() 派生,则 UI 可以访问逻辑,但我无法创建任何窗口,例如ui.ProgressWindow, ui.Alert 需要时来自 main 模块。

【问题讨论】:

  • 这是一个循环导入依赖。简而言之,你可以做一些“聪明”的事情来绕过它们。但你真的不应该。它使代码更加混乱,您应该真正评估为什么将类拆分为单独的文件以及是否应该将它们重新组合在一起。

标签: python class oop tkinter


【解决方案1】:

解决方案是从 main 导入 UI 模块,并在 MainApp() 的构造函数中初始化 BaseApp(),同时将引用传递给 selfBaseApp 稍后可以使用该引用来引用逻辑函数。 MainApp 还会保留对 BaseApp 的引用,它可以用来调用 UI 函数。

class MainApp:
    def __init__(self):
        self.UI = BaseApp(self)

更新:针对循环导入问题,最好将两个类放在同一个文件中。由于逻辑和 UI 功能仍位于不同的类中,因此功能仍将保持不变。

【讨论】:

  • 这实际上似乎只有一种方式工作,否则我做错了什么。 UI->Main 运行良好,但调用 Main-> UI 不能,例如self.ui = BaseApp(self), 然后 self.ui.alert("message") 我得到 AttributeError: "MainApp" object has no attribute "ui"
  • @Ilmiont 上面的代码应该可以工作。确保 MainApp 的实例始终得到维护,并且没有静态调用任何函数。
猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 2018-10-14
  • 2015-03-29
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
相关资源
最近更新 更多