Добавление и просмотр записей в БД
Сделал небольшой 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 шт):
Я не знаком с библиотекой 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())

