将python类拆分为多个文件

时间:2016-01-28 11:12:13

标签: class python-3.x module pyqt5

我想知道是否有人可以告诉我是否可以将以下代码分成两个python类,然后将它们放在两个不同的文件中:

from GUI import mainGUI
from GUI import subwindowGUI

class MyApp(QMainWindow, mainGUI.Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)

        # mainGUI contains QMdiarea in which it opens
        # a subwindow by calling a function MySubWin(self)

        # QMdiarea name is 'body'

        self.OpenSub.triggered.connect(self.MySubWin)

    def MySubWin(self):
        self.MySubWin = QWidget()
        self.MySubWin.setObjectName('Module window')

        self.myTabs = QtabWidget(self.MySubWin)
        self.myTabs.setObjectName('myTabs')

        # now I call the function that will display
        # the gui elements inside this 'Module window'
        self.create_module_gui()

        self.body.addSubWindow(self.MySubWin)
        self.MySubWin.showNormal()

    def create_module_gui(self, *args):
        module_gui = subwindowGUI.Ui_ModuleWindow()
        module_gui.setupUi(module_gui)

        self.myTabs.addTab(module_gui, _('New tab'))
        self.myTabs.setCurrentWidget(module_gui)

从上面的代码中可以看出,我的函数正在与主窗口gui元素进行交互。我想将与这个特定模块相关的这些函数移动到一个单独的文件中,以便进行维护。这就是为什么我要求你帮助我如何实现这一目标,如果有可能的话。先谢谢,Tomislav。

@Mel:

如果我将这些功能移到另一个文件中:

myFunctions.py

class MyFunctions(object):

    def MySubWin(self):
        self.MySubWin = QWidget()
        self.MySubWin.setObjectName('Module window')

        self.myTabs = QtabWidget(self.MySubWin)
        self.myTabs.setObjectName('myTabs')

        # now I call the function that will display
        # the gui elements inside this 'Module window'
        self.create_module_gui()

        self.body.addSubWindow(self.MySubWin)
        self.MySubWin.showNormal()

    def create_module_gui(self, *args):
        module_gui = subwindowGUI.Ui_ModuleWindow()
        module_gui.setupUi(module_gui)

        self.myTabs.addTab(module_gui, _('New tab'))
        self.myTabs.setCurrentWidget(module_gui)

然后我将该文件导入我的主文件。

import myFunctions

class MyApp(QMainWindow, mainGUI.Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)

        # mainGUI contains QMdiarea in which it opens
        # a subwindow by calling a function MySubWin(self)

        # QMdiarea name is 'body'

        self.OpenSub.triggered.connect(MyFunctions.MySubWin)

我最终得到的错误是MyFunctions对象没有属性体。

2 个答案:

答案 0 :(得分:3)

第一,我必须说你不会从中获得任何维护...但是例如让我们将create_module_gui移动到另一个类

在新文件中:creategui.py

class CreateGUI(object):

    def create_module_gui(self, *args):
        module_gui = subwindowGUI.Ui_ModuleWindow()
        module_gui.setupUi(module_gui)

        self.myTabs.addTab(module_gui, _('New tab'))
        self.myTabs.setCurrentWidget(module_gui)
你的代码中的

from GUI import mainGUI
from GUI import subwindowGUI
from creategui import CreateGUI

class MyApp(QMainWindow, mainGUI.Ui_MainWindow, CreateGUI):
     #yay you have your create_module_gui method now...

现在你也可以将create_module_gui作为一个函数放在另一个文件中,并将self作为第一个参数调用...

答案 1 :(得分:1)

查看此解决方案:https://stackoverflow.com/a/47562412/10155767

就您而言,不要在myFunctions.py中上课。而是在顶层定义功能。因此myFunctions.py应该看起来像:

def MySubWin(self):
    ...

def create_module_gui(self, *args):
    ...

然后在您的原始文件中,将类中的功能导入

class MyApp(QMainWindow, mainGUI.Ui_MainWindow):
    from myFunctions import MySubWin, create_module_gui

    def __init__(self, parent=None):
        ...