Добавление и просмотр записей в БД

Сделал небольшой GUI интерфейс написанный в Qt Designer.
Далее написал небольшую функцию на Python используя PyQt.

Если нажать на кнопку make record, то все данные, записанные в пустых полях добавляются в mongodb.
В пустом поле справа от ID должна вводится цифра начиная от 1 и при нажатии на кнопку update record значение цифры должно увеличиваться на 1 автоматически в самом интерфейсе.

Метод make_record() - записывает введенные данные в mongodb, а update_record() - стирает эти данные, а также увеличивает значение записанное в ID на 1 в самом интерфейсе, но этого написать я не смог.

Подскажите как это можно сделать?

main.py:

import sys, time
from PyQt5 import QtWidgets
from pymongo import MongoClient
from test_gui import Ui_MainWindow

class myApp(QtWidgets.QMainWindow):
    def __init__(self):
        super(myApp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.__conn = MongoClient()
        self.myBase = self.__conn["testDB"]
        self.mycoll = self.myBase["testST"]

        self.ui.mrec.clicked.connect(self.make_record)
        self.ui.uprec.clicked.connect(self.update_record)

    def clier_fields(self):
        self.ui.te0.setPlainText("")
        self.ui.te1.setPlainText("")
        self.ui.te2.setPlainText("")
        self.ui.te3.setPlainText("")
        self.ui.te4.setPlainText("")
        self.ui.te5.setPlainText("")

    def make_record(self):
        dct = {
            "_id" : int(self.ui.te0.toPlainText()),
            "LName": self.ui.te1.toPlainText(),
            "FName": self.ui.te2.toPlainText()
        }
        s1 = self.ui.te3.toPlainText()
        s2 = self.ui.te4.toPlainText()
        s3 = self.ui.te5.toPlainText()
        if s1: dct["subj1"] = s1
        if s2: dct["subj2"] = s2
        if s3: dct["subj3"] = s3
        self.mycoll.insert_one(dct)
        time.sleep(1)

    def update_record(self):
       # delete current record from base
       self.mycoll.delete_one({"LName": self.ui.search.toPlainText()})

       self.make_record()
       time.sleep(1)
       self.clier_fields()
       self.ui.search.setPlainText("")

       # read data from gui interface
       dct = {
           "_id" : int(self.ui.te0.toPlainText()),
           "LName": self.ui.te1.toPlainText(),
           "FName": self.ui.te2.toPlainText()
        }
        s1 = self.ui.te3.toPlainText()
        s2 = self.ui.te4.toPlainText()
        s3 = self.ui.te5.toPlainText()
        if s1: dct["subj1"] = s1
        if s2: dct["subj2"] = s2
        if s3: dct["subj3"] = s3
  
app = QtWidgets.QApplication([])
window = myApp()
window.show()
sys.exit(app.exec())

введите сюда описание изображения

test_gui.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(431, 707)
        font = QtGui.QFont()
        font.setPointSize(18)
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.te0 = QtWidgets.QTextEdit(self.centralwidget)
        self.te0.setGeometry(QtCore.QRect(100, 0, 257, 45))
        self.te0.setMarkdown("")
        self.te0.setObjectName("te0")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(12, 0, 121, 45))
        self.label_7.setObjectName("label_7")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(10, 60, 351, 601))
        self.widget.setObjectName("widget")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.te1 = QtWidgets.QTextEdit(self.widget)
        self.te1.setObjectName("te1")
        self.horizontalLayout.addWidget(self.te1)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.te2 = QtWidgets.QTextEdit(self.widget)
        self.te2.setObjectName("te2")
        self.horizontalLayout_2.addWidget(self.te2)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.widget)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_3.addWidget(self.label_3)
        self.te3 = QtWidgets.QTextEdit(self.widget)
        self.te3.setObjectName("te3")
        self.horizontalLayout_3.addWidget(self.te3)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_4 = QtWidgets.QLabel(self.widget)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_4.addWidget(self.label_4)
        self.te4 = QtWidgets.QTextEdit(self.widget)
        self.te4.setObjectName("te4")
        self.horizontalLayout_4.addWidget(self.te4)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_5 = QtWidgets.QLabel(self.widget)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_5.addWidget(self.label_5)
        self.te5 = QtWidgets.QTextEdit(self.widget)
        self.te5.setObjectName("te5")
        self.horizontalLayout_5.addWidget(self.te5)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
        self.verticalLayout_2.addLayout(self.verticalLayout)
        self.mrec = QtWidgets.QPushButton(self.widget)
        self.mrec.setObjectName("mrec")
        self.verticalLayout_2.addWidget(self.mrec)
        self.uprec = QtWidgets.QPushButton(self.widget)
        self.uprec.setObjectName("uprec")
        self.verticalLayout_2.addWidget(self.uprec)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_6 = QtWidgets.QLabel(self.widget)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_6.addWidget(self.label_6)
        self.search = QtWidgets.QTextEdit(self.widget)
        self.search.setObjectName("search")
        self.horizontalLayout_6.addWidget(self.search)
        self.verticalLayout_2.addLayout(self.horizontalLayout_6)
        self.srec = QtWidgets.QPushButton(self.widget)
        self.srec.setObjectName("srec")
        self.verticalLayout_2.addWidget(self.srec)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 431, 38))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.te0.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:18pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>"))
        self.label_7.setText(_translate("MainWindow", "     ID:"))
        self.label.setText(_translate("MainWindow", "LName:"))
        self.label_2.setText(_translate("MainWindow", "FName:"))
        self.label_3.setText(_translate("MainWindow", "  Subj1:"))
        self.label_4.setText(_translate("MainWindow", "  Subj2:"))
        self.label_5.setText(_translate("MainWindow", "  Subj3:"))
        self.mrec.setText(_translate("MainWindow", "make record"))
        self.uprec.setText(_translate("MainWindow", "update record"))
        self.label_6.setText(_translate("MainWindow", "Search:"))
        self.srec.setText(_translate("MainWindow", "search"))

Ответы (1 шт):

Автор решения: S. Nick

Я не знаком с библиотекой pymongo, поэтому у меня в качестве БД будет список словарей.

Я не понял вашу идею с пустом поле справа от ID и его заполнением и стирание данных мне тоже не понятно.

Я реализовал следующее:

  • метод add_record() - добавляет запись в БД, при этом поля "LName" и "FName" - обязательные к заполнения, а остальные нет.
    И главное - ID в моем понимании что-то уникальное и заполняется в моей версии автоматический.

  • метод view_record() - пролистывает записи в БД.

  • метод search_record() - осуществляет поиск записи в БД по полю "LName".

Я немного изменил вашу форму сделанную в Qt Designer. Не злоупотребляйте виджетом QTextEdit, а используйте его по назначению. Также поправил менеджер компоновки, попробуйте изменить размеры окна.

Если будет что-то не понятно - спросите.

import sys
# ??? import time
#from pymongo import MongoClient
from PyQt5 import QtCore, QtGui, QtWidgets

#from test_gui import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(431, 600)
        font = QtGui.QFont()
        font.setPointSize(18)
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        self.te0 = QtWidgets.QLineEdit(self.centralwidget)         # ??? QTextEdit
#        self.te0.setGeometry(QtCore.QRect(100, 0, 257, 45))
#        self.te0.setMarkdown("")
        self.te0.setObjectName("te0")
        
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(12, 0, 121, 45))
        self.label_7.setObjectName("label_7")
        
# ???        self.widget = QtWidgets.QWidget(self.centralwidget)
#        self.widget.setGeometry(QtCore.QRect(10, 60, 351, 601))
#        self.widget.setObjectName("widget")

#        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)   # !!!
        self.verticalLayout_2.setContentsMargins(5, 5, 5, 5)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        
        self.horizontalLayout = QtWidgets.QHBoxLayout()                   # +++
        self.horizontalLayout.setObjectName("horizontalLayout")           # +++
        self.horizontalLayout.addWidget(self.label_7)                     # +++
        self.horizontalLayout.addWidget(self.te0)                         # +++
        self.verticalLayout.addLayout(self.horizontalLayout)              # +++       

        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")        
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.te1 = QtWidgets.QLineEdit(self.centralwidget)         # ??? QTextEdit
        self.te1.setObjectName("te1")
        self.horizontalLayout.addWidget(self.te1)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.te2 = QtWidgets.QLineEdit(self.centralwidget)         # ??? QTextEdit
        self.te2.setObjectName("te2")
        self.horizontalLayout_2.addWidget(self.te2)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_3.addWidget(self.label_3)
        self.te3 = QtWidgets.QTextEdit(self.centralwidget)
        self.te3.setObjectName("te3")
        self.horizontalLayout_3.addWidget(self.te3)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_4.addWidget(self.label_4)
        self.te4 = QtWidgets.QTextEdit(self.centralwidget)
        self.te4.setObjectName("te4")
        self.horizontalLayout_4.addWidget(self.te4)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_5.addWidget(self.label_5)
        self.te5 = QtWidgets.QTextEdit(self.centralwidget)
        self.te5.setObjectName("te5")
        self.horizontalLayout_5.addWidget(self.te5)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
        self.verticalLayout_2.addLayout(self.verticalLayout)
        
        self.mrec = QtWidgets.QPushButton(self.centralwidget)
        self.mrec.setObjectName("mrec")
        self.verticalLayout_2.addWidget(self.mrec)
        self.uprec = QtWidgets.QPushButton(self.centralwidget)
        self.uprec.setObjectName("uprec")
        self.verticalLayout_2.addWidget(self.uprec)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_6.addWidget(self.label_6)
        
        self.search = QtWidgets.QLineEdit(self.centralwidget)         # ??? QTextEdit
        self.search.setObjectName("search")
        self.horizontalLayout_6.addWidget(self.search)
        self.verticalLayout_2.addLayout(self.horizontalLayout_6)
        self.srec = QtWidgets.QPushButton(self.centralwidget)
        self.srec.setObjectName("srec")
        self.verticalLayout_2.addWidget(self.srec)
        
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 431, 38))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
# ???
        ''' 
        self.te0.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:18pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>"))
        '''
        
        self.label_7.setText(_translate("MainWindow", "      ID:"))
        self.label.setText(_translate("MainWindow", "LName:"))
        self.label_2.setText(_translate("MainWindow", "FName:"))
        self.label_3.setText(_translate("MainWindow", "  Subj1:"))
        self.label_4.setText(_translate("MainWindow", "  Subj2:"))
        self.label_5.setText(_translate("MainWindow", "  Subj3:"))
        self.mrec.setText(_translate("MainWindow", "add record"))
        self.uprec.setText(_translate("MainWindow", "view record"))
        self.label_6.setText(_translate("MainWindow", "Search:"))
        self.srec.setText(_translate("MainWindow", "search"))


class MyApp(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyApp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        self.ui.search.setPlaceholderText('Введите LName для поиска.')
        
#        self.__conn = MongoClient()
#        self.myBase = self.__conn["testDB"]
#        self.mycoll = self.myBase["testST"]

        self.mongoClients = []
        self.lastRecord = len(self.mongoClients)

        self.ui.mrec.clicked.connect(self.add_record)            # add_record
        self.ui.uprec.clicked.connect(self.view_record)          # view_record
        self.ui.srec.clicked.connect(self.search_record)         # search_record
        
        self.ui.te0.setReadOnly(True)
        self.ui.te0.setText(f"{self.lastRecord + 1}")
        self.flag_add = True
        self.current_record = self.lastRecord
        self.ui.te1.setFocus()
        
    def clier_fields(self):
#        self.ui.te0.clear()
        self.ui.te1.clear()
        self.ui.te2.clear()
        self.ui.te3.clear()
        self.ui.te4.clear()
        self.ui.te5.clear()

    def add_record(self):
        if not self.flag_add:
            self.clier_fields()
            self.flag_add = True
            self.ui.te0.setText(f"{self.lastRecord + 1}")
            self.ui.te1.setFocus()
    
        _id = self.lastRecord + 1
        _LName = self.ui.te1.text()
        _FName = self.ui.te2.text()
        if not _LName or not _FName:
            msg = QtWidgets.QMessageBox.warning(
                self, 
                'Внимание', 'Заполните пожалуйста все поля.'
            ) 
            return
            
        if _LName in [ r["LName"] for r in self.mongoClients]:
            msg = QtWidgets.QMessageBox.warning(
                self, 
                'Внимание', 'Запись с таким "LName" уже существует.'
            ) 
            return        
        
        dct = {
            "_id" : _id,        
            "LName": _LName,
            "FName": _FName
        }
        dct["subj1"] = self.ui.te3.toPlainText()
        dct["subj2"] = self.ui.te4.toPlainText()
        dct["subj3"] = self.ui.te5.toPlainText()

        self.mongoClients.append(dct)
        self.lastRecord += 1  
        self.current_record = self.lastRecord

        msg = QtWidgets.QMessageBox.information(
            self, 
            'Успес', 'Вы добавили запись.'
        )         
        self.ui.te0.setText(f"{self.lastRecord + 1}")
        self.clier_fields()
        
#        self.mycoll.insert_one(dct)
# ???        time.sleep(1)

    def view_record(self):
        if not self.current_record:
            msg = QtWidgets.QMessageBox.information(
                self, 
                'Внимание', 'Нет записей. Смотреть нечего.'
            )        
            return
    
        self.flag_add = False
        if self.current_record >= self.lastRecord :
            self.current_record = 0

        record = self.mongoClients[self.current_record - 1]
        self.current_record += 1
        
        self.ui.te0.setText(f'{record["_id"]}')
        self.ui.te1.setText(record["LName"])
        self.ui.te2.setText(record["FName"])
        self.ui.te3.setPlainText(record["subj1"])
        self.ui.te4.setPlainText(record["subj2"])
        self.ui.te5.setPlainText(record["subj3"])        
        
    def search_record(self):
        _search = self.ui.search.text()
        if not _search:
            msg = QtWidgets.QMessageBox.information(
                self, 
                'Внимание', 'Введите LName для поиска.'
            )        
            return   

        if not _search in [ r["LName"] for r in self.mongoClients]:
            msg = QtWidgets.QMessageBox.warning(
                self, 
                'Внимание', 'Нет запись с таким "LName".'
            ) 
            return  

        for i, r in enumerate(self.mongoClients):
            if r["LName"] == _search:
                self.current_record = i
                
                record = self.mongoClients[i]
                self.ui.te0.setText(f'{record["_id"]}')
                self.ui.te1.setText(record["LName"])
                self.ui.te2.setText(record["FName"])
                self.ui.te3.setPlainText(record["subj1"])
                self.ui.te4.setPlainText(record["subj2"])
                self.ui.te5.setPlainText(record["subj3"])                 
                self.flag_add = False
                return


if __name__=='__main__':   
    app = QtWidgets.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec())

введите сюда описание изображения

→ Ссылка