Разбивка на модули кода для однооконного приложения Python
Создаю приложение. Интерфейс создается в Qt Designer. Все действия будут происходить в одном окне.
Из меню вызывается одна из страниц stackedWidget
, на которой расположен tabWidget
. На каждой вкладке tabWidget
расположены поля для ввода/вывода информации и кнопки, а так же кнопка для печати отчета в pdf.
По сути каждая вкладка это самостоятельный расчет. В tabWidget
они объединены по функциональному признаку.
Для каждой вкладки tabWidget
получается достаточно большой код программы.
Сейчас у меня создан один класс
class MyProgram(QMainWindow):
в котором методы описывающие действия на форме: ввод данных, нажатие кнопок.
По задумке хотел каждый расчет (вкладку tab
) вынести в отдельный модуль (файл). Чтобы было проще ориентироваться в коде и в последствии добавлять новые расчеты.
В настоящий момент написан код для одной вкладки. Не могу понять как разбить код на модули, каким функционалом воспользоваться.
Возможно ли это технически? Или при данной структуре меню нужно все делать в одном классе и соответственно в одном модуле?
В какую стороны копать? Читал про наследование и т.п. Картинка в голове не сложилась. Прошу совета.
Минимальный воспроизводимый пример. Так как минимизировать и воспроизвести несколько тысяч строк кода, что бы было понятно, достаточно трудно. Сделал аналог программы в миниатюре. Вычислительные функции упростил, а идею полностью сохранил.
При запуске имеем начальное окно:
При выборе первого меню (Сложение Вычитание) открывается окно:
Если выбрать вкладку разность:
При выборе меню Умножение Деление
Код:
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow, QApplication
class MyProgram(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('Form/Test.ui', self)
self.initUI()
def initUI(self):
self.actionSumDifference.triggered.connect(self.window_sum_difference) # Выбор меню Сумма Разность
self.actionWorkDivision.triggered.connect(self.window_work_division) # Выбор меню Умножение Деление
self.pushButtonSum.clicked.connect(self.calculation_sum) # Кнопка вычисления суммы
self.pushButtonDifference.clicked.connect(self.calculation_difference) # Кнопка вычисления разности
self.pushButtonWork.clicked.connect(self.calculation_work) # Кнопка вычисления произведения
self.pushButtonQuotient.clicked.connect(self.calculation_quotient) # Кнопка вычисления деления
def window_sum_difference(self):
self.stackedWidget.setCurrentWidget(self.pageSumDifference)
def window_work_division(self):
self.stackedWidget.setCurrentWidget(self.pageWorkDivision)
def calculation_sum(self):
a = float(self.lineEdiTerm1.text())
b = float(self.lineEdiTerm2.text())
s = a + b
self.lineEditSum.setText(str("%.2f" % s))
def calculation_difference(self):
a = float(self.lineEditMinuend.text())
b = float(self.lineEditSubtrahend.text())
d = a - b
self.lineEditDifference.setText(str("%.2f" % d))
def calculation_work(self):
a = float(self.lineEditFactor1.text())
b = float(self.lineEditFactor2.text())
p = a * b
self.lineEditWork.setText(str("%.2f" % p))
def calculation_quotient(self):
a = float(self.lineEditDividend.text())
b = float(self.lineEditDivider.text())
q = a / b
self.lineEditQuotient.setText(str("%.2f" % q))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyProgram()
ex.show()
sys.exit(app.exec_())
Вопрос: Как вынести вычисления суммы, разности, произведения и деления каждый в отдельный модуль, если такое возможно?
Не знаю правильно или нет. Как смог получил Test.ui
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 260)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
self.stackedWidget.setObjectName("stackedWidget")
self.pageSumDifference = QtWidgets.QWidget()
self.pageSumDifference.setObjectName("pageSumDifference")
self.gridLayout_2 = QtWidgets.QGridLayout(self.pageSumDifference)
self.gridLayout_2.setObjectName("gridLayout_2")
self.tabWidgeSumDifference = QtWidgets.QTabWidget(self.pageSumDifference)
self.tabWidgeSumDifference.setObjectName("tabWidgeSumDifference")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.formLayout = QtWidgets.QFormLayout(self.tab)
self.formLayout.setObjectName("formLayout")
self.label = QtWidgets.QLabel(self.tab)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
self.lineEdiTerm1 = QtWidgets.QLineEdit(self.tab)
self.lineEdiTerm1.setObjectName("lineEdiTerm1")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdiTerm1)
self.label_2 = QtWidgets.QLabel(self.tab)
self.label_2.setObjectName("label_2")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
self.lineEdiTerm2 = QtWidgets.QLineEdit(self.tab)
self.lineEdiTerm2.setObjectName("lineEdiTerm2")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdiTerm2)
self.pushButtonSum = QtWidgets.QPushButton(self.tab)
self.pushButtonSum.setObjectName("pushButtonSum")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.pushButtonSum)
self.label_3 = QtWidgets.QLabel(self.tab)
self.label_3.setObjectName("label_3")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_3)
self.lineEditSum = QtWidgets.QLineEdit(self.tab)
self.lineEditSum.setObjectName("lineEditSum")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEditSum)
self.tabWidgeSumDifference.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.formLayout_2 = QtWidgets.QFormLayout(self.tab_2)
self.formLayout_2.setObjectName("formLayout_2")
self.label_4 = QtWidgets.QLabel(self.tab_2)
self.label_4.setObjectName("label_4")
self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_4)
self.lineEditMinuend = QtWidgets.QLineEdit(self.tab_2)
self.lineEditMinuend.setObjectName("lineEditMinuend")
self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEditMinuend)
self.label_5 = QtWidgets.QLabel(self.tab_2)
self.label_5.setObjectName("label_5")
self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_5)
self.lineEditSubtrahend = QtWidgets.QLineEdit(self.tab_2)
self.lineEditSubtrahend.setObjectName("lineEditSubtrahend")
self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEditSubtrahend)
self.pushButtonDifference = QtWidgets.QPushButton(self.tab_2)
self.pushButtonDifference.setObjectName("pushButtonDifference")
self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.pushButtonDifference)
self.label_6 = QtWidgets.QLabel(self.tab_2)
self.label_6.setObjectName("label_6")
self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_6)
self.lineEditDifference = QtWidgets.QLineEdit(self.tab_2)
self.lineEditDifference.setObjectName("lineEditDifference")
self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEditDifference)
self.tabWidgeSumDifference.addTab(self.tab_2, "")
self.gridLayout_2.addWidget(self.tabWidgeSumDifference, 0, 0, 1, 1)
self.stackedWidget.addWidget(self.pageSumDifference)
self.page = QtWidgets.QWidget()
self.page.setObjectName("page")
self.label_13 = QtWidgets.QLabel(self.page)
self.label_13.setGeometry(QtCore.QRect(220, 80, 381, 24))
font = QtGui.QFont()
font.setPointSize(15)
self.label_13.setFont(font)
self.label_13.setObjectName("label_13")
self.stackedWidget.addWidget(self.page)
self.pageWorkDivision = QtWidgets.QWidget()
self.pageWorkDivision.setObjectName("pageWorkDivision")
self.gridLayout_3 = QtWidgets.QGridLayout(self.pageWorkDivision)
self.gridLayout_3.setObjectName("gridLayout_3")
self.tabWidgeWorkDivision = QtWidgets.QTabWidget(self.pageWorkDivision)
self.tabWidgeWorkDivision.setObjectName("tabWidgeWorkDivision")
self.tab_3 = QtWidgets.QWidget()
self.tab_3.setObjectName("tab_3")
self.formLayout_3 = QtWidgets.QFormLayout(self.tab_3)
self.formLayout_3.setObjectName("formLayout_3")
self.label_7 = QtWidgets.QLabel(self.tab_3)
self.label_7.setObjectName("label_7")
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_7)
self.lineEditFactor1 = QtWidgets.QLineEdit(self.tab_3)
self.lineEditFactor1.setObjectName("lineEditFactor1")
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEditFactor1)
self.label_8 = QtWidgets.QLabel(self.tab_3)
self.label_8.setObjectName("label_8")
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_8)
self.lineEditFactor2 = QtWidgets.QLineEdit(self.tab_3)
self.lineEditFactor2.setObjectName("lineEditFactor2")
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEditFactor2)
self.pushButtonWork = QtWidgets.QPushButton(self.tab_3)
self.pushButtonWork.setObjectName("pushButtonWork")
self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.pushButtonWork)
self.label_9 = QtWidgets.QLabel(self.tab_3)
self.label_9.setObjectName("label_9")
self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_9)
self.lineEditWork = QtWidgets.QLineEdit(self.tab_3)
self.lineEditWork.setObjectName("lineEditWork")
self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEditWork)
self.tabWidgeWorkDivision.addTab(self.tab_3, "")
self.tab_4 = QtWidgets.QWidget()
self.tab_4.setObjectName("tab_4")
self.formLayout_4 = QtWidgets.QFormLayout(self.tab_4)
self.formLayout_4.setObjectName("formLayout_4")
self.label_10 = QtWidgets.QLabel(self.tab_4)
self.label_10.setObjectName("label_10")
self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_10)
self.lineEditDividend = QtWidgets.QLineEdit(self.tab_4)
self.lineEditDividend.setObjectName("lineEditDividend")
self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEditDividend)
self.label_11 = QtWidgets.QLabel(self.tab_4)
self.label_11.setObjectName("label_11")
self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_11)
self.lineEditDivider = QtWidgets.QLineEdit(self.tab_4)
self.lineEditDivider.setObjectName("lineEditDivider")
self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEditDivider)
self.pushButtonQuotient = QtWidgets.QPushButton(self.tab_4)
self.pushButtonQuotient.setObjectName("pushButtonQuotient")
self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.pushButtonQuotient)
self.label_12 = QtWidgets.QLabel(self.tab_4)
self.label_12.setObjectName("label_12")
self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_12)
self.lineEditQuotient = QtWidgets.QLineEdit(self.tab_4)
self.lineEditQuotient.setObjectName("lineEditQuotient")
self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEditQuotient)
self.tabWidgeWorkDivision.addTab(self.tab_4, "")
self.gridLayout_3.addWidget(self.tabWidgeWorkDivision, 0, 0, 1, 1)
self.stackedWidget.addWidget(self.pageWorkDivision)
self.horizontalLayout.addWidget(self.stackedWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionSumDifference = QtWidgets.QAction(MainWindow)
self.actionSumDifference.setObjectName("actionSumDifference")
self.actionWorkDivision = QtWidgets.QAction(MainWindow)
self.actionWorkDivision.setObjectName("actionWorkDivision")
self.menu.addAction(self.actionSumDifference)
self.menu.addAction(self.actionWorkDivision)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.stackedWidget.setCurrentIndex(1)
self.tabWidgeSumDifference.setCurrentIndex(0)
self.tabWidgeWorkDivision.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Слагаемое 1"))
self.label_2.setText(_translate("MainWindow", "Слагаемое 2"))
self.pushButtonSum.setText(_translate("MainWindow", "Расчет"))
self.label_3.setText(_translate("MainWindow", "Сумма"))
self.tabWidgeSumDifference.setTabText(self.tabWidgeSumDifference.indexOf(self.tab), _translate("MainWindow", "Сумма"))
self.label_4.setText(_translate("MainWindow", "Уменьшаемое"))
self.label_5.setText(_translate("MainWindow", "Вычитаемое"))
self.pushButtonDifference.setText(_translate("MainWindow", "Расчет"))
self.label_6.setText(_translate("MainWindow", "Разность"))
self.tabWidgeSumDifference.setTabText(self.tabWidgeSumDifference.indexOf(self.tab_2), _translate("MainWindow", "Разность"))
self.label_13.setText(_translate("MainWindow", "Математическая программка"))
self.label_7.setText(_translate("MainWindow", "Множитель 1"))
self.label_8.setText(_translate("MainWindow", "Множитель 2"))
self.pushButtonWork.setText(_translate("MainWindow", "Расчет"))
self.label_9.setText(_translate("MainWindow", "Произведение"))
self.tabWidgeWorkDivision.setTabText(self.tabWidgeWorkDivision.indexOf(self.tab_3), _translate("MainWindow", "Умножение"))
self.label_10.setText(_translate("MainWindow", "Делимое"))
self.label_11.setText(_translate("MainWindow", "Делитель"))
self.pushButtonQuotient.setText(_translate("MainWindow", "Расчет"))
self.label_12.setText(_translate("MainWindow", "Частное"))
self.tabWidgeWorkDivision.setTabText(self.tabWidgeWorkDivision.indexOf(self.tab_4), _translate("MainWindow", "Деление"))
self.menu.setTitle(_translate("MainWindow", "Меню"))
self.actionSumDifference.setText(_translate("MainWindow", "Сложение Вычитание"))
self.actionWorkDivision.setText(_translate("MainWindow", "Умножение Деление"))