在Python桌面应用程序中使用什么架构模式

2024-09-25 18:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python编程语言的新手。 我打算用“PyQt”构建桌面应用程序。。。在

我一直在寻找构建应用程序时要使用的最佳架构设计。在

每个应用程序将组成:用户界面和数据库(mySql)。在

我很感谢在这个领域的任何帮助,一些有见地的例子将是非常有帮助的。在

编辑:

我试着在一个测试对象中应用mvc模式,就像我的主管建议的那样。。。这是我的代码:

视图类(由pyuic5命令生成):

from PyQt5 import QtWidgets, QtCore, QtGui
from datetime import *
import sys

class Ui_Dialog(QtWidgets.QDialog):

    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 200)

        self.vLayout = QtWidgets.QVBoxLayout(Dialog)
        self.vLayout.setObjectName("verticalLayout")


        self.widget = QtWidgets.QWidget(Dialog)
        self.widget.setGeometry(QtCore.QRect(15, 20, 366, 206))
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.gridLayout.setRowMinimumHeight(0, 50)
        self.gridLayout.setRowMinimumHeight(1, 50)
        self.gridLayout.setRowMinimumHeight(2, 50)
        self.gridLayout.setRowMinimumHeight(3, 20)

        self.label = QtWidgets.QLabel(self.widget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.widget)
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit.setEnabled(False)
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 3)
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 3)
        self.label_3 = QtWidgets.QLabel(self.widget)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.widget)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.gridLayout.addWidget(self.lineEdit_3, 2, 1, 1, 3)

        #Add PushButtons
        self.pbNext = QtWidgets.QPushButton(">", self)
        self.gridLayout.addWidget(self.pbNext, 3, 2)

        self.pbPrevious = QtWidgets.QPushButton("<", self)
        self.gridLayout.addWidget(self.pbPrevious, 3, 1)

        self.pbFirst = QtWidgets.QPushButton("<<", self)
        self.gridLayout.addWidget(self.pbFirst, 3, 0)

        self.pbLast = QtWidgets.QPushButton(">>", self)
        self.gridLayout.addWidget(self.pbLast, 3, 3)

        self.pbAdd = QtWidgets.QPushButton("+", self)
        self.gridLayout.addWidget(self.pbAdd, 0, 4)

        self.pbDelete = QtWidgets.QPushButton("x", self)
        self.gridLayout.addWidget(self.pbDelete, 1, 4)

        self.pbOpenId = QtWidgets.QPushButton("OpenId", self)
        self.gridLayout.addWidget(self.pbOpenId, 2, 4)

        self.pbQuit = QtWidgets.QPushButton("Quit", self)
        self.gridLayout.addWidget(self.pbQuit, 3, 4)

        self.vLayout.addLayout(self.gridLayout)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Test my dialog"))
        self.label.setText(_translate("Dialog", "Id"))
        self.label_2.setText(_translate("Dialog", "First name"))
        self.label_3.setText(_translate("Dialog", "Last name"))

模型类:

^{pr2}$

这是我的控制器:

import sys
from PyQt5 import QtGui, QtCore, QtWidgets, QtSql
import View
import Model

FIRST, LAST, PREVIOUS, NEXT = range(4)

class Controller(QtWidgets.QDialog):

    def __init__(self, parent = None):
        super().__init__(parent)
        self.myDlg = View.Ui_Dialog()
        self.connectButtons()

        self.dbModel = Model.DBModel("mydb", "localhost", "root", "", "person")

        # create a model that reads from "Person" table in db "MyDB"
        self.tblRowCount = self.dbModel.modelRowCount

        self.modelRowCount = self.dbModel.getModelRowCount()

        # map the dlg fields to the db fields
        self.mapper = QtWidgets.QDataWidgetMapper(self)
        self.mapper.setSubmitPolicy(QtWidgets.QDataWidgetMapper.ManualSubmit)
        self.mapper.setModel(self.dbModel.model)
        self.mapper.addMapping(self.myDlg.lineEdit, 0)
        self.mapper.addMapping(self.myDlg.lineEdit_2, 1)
        self.mapper.addMapping(self.myDlg.lineEdit_3, 2)
        self.mapper.toFirst()

        self.setButtonsEnabled()

    def connectButtons(self):
        self.myDlg.pbNext.clicked.connect(lambda: self.navigate(NEXT))
        self.myDlg.pbPrevious.clicked.connect(lambda: self.navigate(PREVIOUS))
        self.myDlg.pbLast.clicked.connect(lambda: self.navigate(LAST))
        self.myDlg.pbFirst.clicked.connect(lambda: self.navigate(FIRST))

        self.myDlg.pbQuit.clicked.connect(self.quit)
        self.myDlg.pbAdd.clicked.connect(self.addRecord)
        self.myDlg.pbDelete.clicked.connect(self.deleteRecord)
        self.myDlg.pbOpenId.clicked.connect(self.openId)

    def navigate(self, p_intDirection):

        intRow = self.mapper.currentIndex()
        self.mapper.submit()

        if p_intDirection == FIRST:
            intRow = 0
        elif p_intDirection == LAST:
            intRow = self.dbModel.modelRowCount - 1
        elif p_intDirection == NEXT:
            intRow += 1
        elif p_intDirection == PREVIOUS:
            intRow -= 1

        self.mapper.setCurrentIndex(intRow)
        self.setButtonsEnabled()

    def setButtonsEnabled(self):
        intCurrentIndex = self.mapper.currentIndex()

        if self.modelRowCount == 1:
            self.myDlg.pbPrevious.setEnabled(False)
            self.myDlg.pbNext.setEnabled(False)
            self.myDlg.pbLast.setEnabled(False)
            self.myDlg.pbFirst.setEnabled(False)
        if intCurrentIndex == 0:
            self.myDlg.pbPrevious.setEnabled(False)
            self.myDlg.pbNext.setEnabled(True)
            self.myDlg.pbLast.setEnabled(True)
            self.myDlg.pbFirst.setEnabled(False)
        elif intCurrentIndex == self.modelRowCount - 1:
            self.myDlg.pbPrevious.setEnabled(True)
            self.myDlg.pbNext.setEnabled(False)
            self.myDlg.pbLast.setEnabled(False)
            self.myDlg.pbFirst.setEnabled(True)
        else:
            self.myDlg.pbPrevious.setEnabled(True)
            self.myDlg.pbNext.setEnabled(True)
            self.myDlg.pbLast.setEnabled(True)
            self.myDlg.pbFirst.setEnabled(True)

    def quit(self):
        self.mapper.submit()
        QtWidgets.QDialog.accept(self.myDlg)

    def addRecord(self):
        self.mapper.submit()
        self.dbModel.insertRow()
        self.mapper.setCurrentIndex(self.modelRowCount + 1)

        self.modelRowCount += 1
        self.myDlg.lineEdit.setText(str(self.modelRowCount + 1))
        self.myDlg.lineEdit_2.setText("")
        self.myDlg.lineEdit_3.setText("")
        self.setButtonsEnabled()

        self.myDlg.lineEdit_2.setFocus()

        self.dbModel.getMaxId()

    def deleteRecord(self):
        intCrntRow = self.mapper.currentIndex()

        if QtWidgets.QMessageBox.question(self, "Confirmation", """Are you sure you want to delete             the person
            {0} {1} ?""".format(self.lineEdit_2.text(), self.lineEdit_3.text())) == QtWidgets.QMessageBox.No:
           return

        self.dbModel.deleteRowByIndex(intCrntRow)

        if intCrntRow - 1 < 0:
            intCrntRow += 1
        else:
            intCrntRow -= 1

        self.mapper.setCurrentIndex(intCrntRow)

        self.setButtonsEnabled()

    def openId(self):
        self.dbModel.getDataForId(7)
        self.mapper.toFirst()

重点是我读到视图应该有一个控制器的实例,这里没有,我看不到在这里做的意义。尤其是我不想更改pyuic命令生成的文件。在

我没有具体说明要使用什么模式,我在搜索,试图找到最流行的模式,可以应用于桌面应用程序与数据库,使用PyQt工具包。在

希望你能在这个话题上了解我。在


Tags: selffalsedefwidgetlabeldialogmapperqtwidgets