Как реализовать автозаполнение данных в форму PyQt6?
У меня есть форма для заполнения договоров на написанная на Python с помощью PyQt6. После заполнения договора она сохраняет данные пользователя в базу данных sqlite3.
Я хочу реализовать функцию, что когда пользователь вводить имя и фамилию водителя, то программа проверяет, есть ли его данные в БД. Если они есть, то она предлагает вставить эти данные в форму, если нет, то не делает ничего.
Как можно это реализовать?
AutoDraft.py:
import sys
import sqlite3
from PyQt6 import QtWidgets
from docxtpl import DocxTemplate
from ui.py.AutoDraftUi import Ui_AutoDraft
class AutoDraftApp(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_AutoDraft()
self.ui.setupUi(self)
# Соединяем кнопку с функцией загрузки
self.ui.pushButton.clicked.connect(self.fill_contract)
# Создание базы данных и таблицы, если они не существуют
self.create_database()
def create_database(self):
# Подключение к базе данных (или создание, если она не существует)
self.conn = sqlite3.connect('drivers_data.db')
self.cursor = self.conn.cursor()
# Создание таблицы, если она не существует
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS drivers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
birth_date TEXT,
birth_place TEXT,
phone TEXT,
address TEXT,
passport_data TEXT,
passport_issue_date TEXT,
driver_license TEXT,
driver_license_issue_date TEXT,
second_driver TEXT,
second_driver_birth_date TEXT,
second_driver_phone TEXT,
second_passport_data TEXT,
second_passport_issue_date TEXT,
second_driver_license TEXT,
second_driver_license_issue_date TEXT
)
''')
self.conn.commit()
def fill_contract(self):
# Сбор данных из LineEdit
name = self.ui.lineEdit.text()
birth_date = self.ui.lineEdit_2.text()
birth_place = self.ui.lineEdit_3.text()
phone = self.ui.lineEdit_4.text()
passport_data = self.ui.lineEdit_17.text()
passport_issue_date = self.ui.lineEdit_18.text()
driver_license = self.ui.lineEdit_19.text()
driver_license_issue_date = self.ui.lineEdit_20.text()
second_driver = self.ui.lineEdit_7.text()
second_driver_birth_date = self.ui.lineEdit_5.text()
second_driver_phone = self.ui.lineEdit_6.text()
second_passport_data = self.ui.lineEdit_13.text()
second_passport_issue_date = self.ui.lineEdit_14.text()
second_driver_license = self.ui.lineEdit_15.text()
second_driver_license_issue_date = self.ui.lineEdit_16.text()
car_type = self.ui.lineEdit_8.text()
registration_number = self.ui.lineEdit_11.text()
rental_start = self.ui.lineEdit_9.text()
rental_end = self.ui.lineEdit_10.text()
days = self.ui.lineEdit_22.text()
return_place = self.ui.lineEdit_24.text()
place_delivery = self.ui.lineEdit_23.text()
price = self.ui.lineEdit_25.text()
total = self.ui.lineEdit_26.text()
deposit = self.ui.lineEdit_27.text()
payment_type = self.ui.lineEdit_12.text()
second_driver_address = self.ui.lineEdit_21.text()
address = self.ui.lineEdit_28.text()
# Сбор данных из ComboBox
fuel_type = self.ui.comboBox_2.currentText()
export_permit = self.ui.comboBox.currentText()
# Создание контекста для заполнения шаблона
context = {
'name': name,
'birth_date': birth_date,
'birth_place': birth_place,
'phone': phone,
'address': address,
'passport_data': passport_data,
'passport_issue_date': passport_issue_date,
'driver_license': driver_license,
'driver_license_issue_date': driver_license_issue_date,
'second_driver': second_driver,
'second_driver_birth_date': second_driver_birth_date,
'second_driver_phone': second_driver_phone,
'second_passport_data': second_passport_data,
'second_passport_issue_date': second_passport_issue_date,
'second_driver_license': second_driver_license,
'second_driver_license_issue_date': second_driver_license_issue_date,
'car_type': car_type,
'second_driver_address': second_driver_address,
'registration_number': registration_number,
'rental_start': rental_start,
'rental_end': rental_end,
'days': days,
'place_return': return_place,
'place_delivery ': place_delivery,
'price': price,
'total': total,
'deposit': deposit,
'payment_type': payment_type,
'fuel_type': fuel_type,
'export_permit': export_permit,
}
try:
# Загрузка шаблона
template_path = "Contract_new.docx"
doc = DocxTemplate(template_path)
# Заполнение шаблона данными
doc.render(context)
# Сохранение заполненного документа в формате DOCX
filled_filename = f"filled_contract_{name}.docx"
doc.save(filled_filename)
# Вставка данных в базу данных
self.insert_driver_data(context)
except FileNotFoundError:
QtWidgets.QMessageBox.critical(self, "Ошибка", "Шаблон документа не найден. Проверьте путь к файлу.")
except Exception as e:
QtWidgets.QMessageBox.critical(self, "Ошибка", f"Произошла ошибка: {str(e)}")
def insert_driver_data(self, context):
# Вставка данных в таблицу
self.cursor.execute('''
INSERT INTO drivers (
name, birth_date, birth_place, phone, address,
passport_data, passport_issue_date, driver_license,
driver_license_issue_date, second_driver, second_driver_birth_date,
second_driver_phone, second_passport_data, second_passport_issue_date,
second_driver_license, second_driver_license_issue_date
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (
context['name'], context['birth_date'], context['birth_place'], context['phone'], context['address'],
context['passport_data'], context['passport_issue_date'], context['driver_license'],
context['driver_license_issue_date'], context['second_driver'], context['second_driver_birth_date'],
context['second_driver_phone'], context['second_passport_data'], context['second_passport_issue_date'],
context['second_driver_license'], context['second_driver_license_issue_date']
))
self.conn.commit()
def closeEvent(self, event):
# Закрытие соединения с базой данных при выходе
self.conn.close()
event.accept()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = AutoDraftApp()
window.show()
sys.exit(app.exec())
AutoDraftUi.py:
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_AutoDraft(object):
def setupUi(self, AutoDraft):
AutoDraft.setObjectName("AutoDraft")
AutoDraft.resize(454, 640)
AutoDraft.setMinimumSize(QtCore.QSize(420, 640))
AutoDraft.setMaximumSize(QtCore.QSize(454, 643))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("C:/Users/Андрей/Downloads/agreement_contract_deal_arrangement_understanding_icon_262930.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
AutoDraft.setWindowIcon(icon)
AutoDraft.setStyleSheet("QLineEdit {\n"
" min-height: 30px; \n"
" max-height: 30px;\n"
"}\n"
"QPushButton {\n"
" min-height: 30px; \n"
" max-height: 30px;\n"
"}\n"
"QComboBox {\n"
" min-height: 30px; \n"
" max-height: 30px;\n"
"}\n"
"\n"
"QPushButton {\n"
" background-color: orange;\n"
" color: white; /* Цвет текста */\n"
" border: 1px solid darkorange; /* Цвет рамки */\n"
"}\n"
"\n"
"QLineEdit {\n"
" font-size: 18px; /* Увеличиваем размер шрифта */\n"
" background-color: orange; /* Цвет фона */\n"
" color: white; /* Цвет текста */\n"
" border: 1px solid darkorange; /* Цвет рамки */\n"
"}\n"
"\n"
"QComboBox {\n"
" font-size: 18px; /* Увеличиваем размер шрифта */\n"
" background-color: orange; /* Цвет фона */\n"
" color: white; /* Цвет текста */\n"
" border: 1px solid darkorange; /* Цвет рамки */\n"
"}\n"
"\n"
"QComboBox QAbstractItemView {\n"
" font-size: 18px; /* Увеличиваем размер шрифта для выпадающего списка */\n"
" background-color: orange; /* Цвет фона выпадающего списка */\n"
" color: white; /* Цвет текста выпадающего списка */\n"
"}\n"
"\n"
"QTabWidget::pane {\n"
" background-color: orange; /* Цвет фона вкладок */\n"
"}\n"
"\n"
"QTabBar::tab {\n"
" background-color: orange; /* Цвет фона вкладок */\n"
" color: white; /* Цвет текста вкладок */\n"
" padding: 10px; /* Отступы */\n"
"}\n"
"\n"
"QTabBar::tab:selected {\n"
" background-color: darkorange; /* Цвет фона выбранной вкладки */\n"
" color: white; /* Цвет текста выбранной вкладки */\n"
"}\n"
"")
AutoDraft.setIconSize(QtCore.QSize(512, 512))
self.centralwidget = QtWidgets.QWidget(parent=AutoDraft)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.scrollArea = QtWidgets.QScrollArea(parent=self.centralwidget)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 417, 916))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.gridLayout_4 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
self.gridLayout_4.setObjectName("gridLayout_4")
self.line = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents)
self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.line.setObjectName("line")
self.gridLayout_4.addWidget(self.line, 1, 0, 1, 1)
self.tabWidget = QtWidgets.QTabWidget(parent=self.scrollAreaWidgetContents)
self.tabWidget.setObjectName("tabWidget")
self.tab_3 = QtWidgets.QWidget()
self.tab_3.setObjectName("tab_3")
self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_3)
self.gridLayout_2.setObjectName("gridLayout_2")
self.lineEdit = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit.setObjectName("lineEdit")
self.gridLayout_2.addWidget(self.lineEdit, 1, 0, 1, 1)
self.lineEdit_3 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_3.setObjectName("lineEdit_3")
self.gridLayout_2.addWidget(self.lineEdit_3, 3, 0, 1, 1)
self.lineEdit_2 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_2.setObjectName("lineEdit_2")
self.gridLayout_2.addWidget(self.lineEdit_2, 0, 0, 1, 1)
self.lineEdit_4 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_4.setObjectName("lineEdit_4")
self.gridLayout_2.addWidget(self.lineEdit_4, 4, 0, 1, 1)
self.lineEdit_20 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_20.setObjectName("lineEdit_20")
self.gridLayout_2.addWidget(self.lineEdit_20, 8, 0, 1, 1)
self.lineEdit_17 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_17.setObjectName("lineEdit_17")
self.gridLayout_2.addWidget(self.lineEdit_17, 5, 0, 1, 1)
self.lineEdit_19 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_19.setObjectName("lineEdit_19")
self.gridLayout_2.addWidget(self.lineEdit_19, 7, 0, 1, 1)
self.lineEdit_18 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_18.setObjectName("lineEdit_18")
self.gridLayout_2.addWidget(self.lineEdit_18, 6, 0, 1, 1)
self.lineEdit_28 = QtWidgets.QLineEdit(parent=self.tab_3)
self.lineEdit_28.setObjectName("lineEdit_28")
self.gridLayout_2.addWidget(self.lineEdit_28, 2, 0, 1, 1)
self.tabWidget.addTab(self.tab_3, "")
self.tab_4 = QtWidgets.QWidget()
self.tab_4.setObjectName("tab_4")
self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_4)
self.gridLayout_3.setObjectName("gridLayout_3")
self.lineEdit_15 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_15.setObjectName("lineEdit_15")
self.gridLayout_3.addWidget(self.lineEdit_15, 6, 0, 1, 1)
self.lineEdit_14 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_14.setObjectName("lineEdit_14")
self.gridLayout_3.addWidget(self.lineEdit_14, 5, 0, 1, 1)
self.lineEdit_13 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_13.setObjectName("lineEdit_13")
self.gridLayout_3.addWidget(self.lineEdit_13, 4, 0, 1, 1)
self.lineEdit_6 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_6.setObjectName("lineEdit_6")
self.gridLayout_3.addWidget(self.lineEdit_6, 3, 0, 1, 1)
self.lineEdit_5 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_5.setObjectName("lineEdit_5")
self.gridLayout_3.addWidget(self.lineEdit_5, 2, 0, 1, 1)
self.lineEdit_16 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_16.setObjectName("lineEdit_16")
self.gridLayout_3.addWidget(self.lineEdit_16, 7, 0, 1, 1)
self.lineEdit_7 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_7.setObjectName("lineEdit_7")
self.gridLayout_3.addWidget(self.lineEdit_7, 0, 0, 1, 1)
self.lineEdit_21 = QtWidgets.QLineEdit(parent=self.tab_4)
self.lineEdit_21.setObjectName("lineEdit_21")
self.gridLayout_3.addWidget(self.lineEdit_21, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab_4, "")
self.gridLayout_4.addWidget(self.tabWidget, 0, 0, 1, 1)
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.lineEdit_8 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_8.setObjectName("lineEdit_8")
self.verticalLayout.addWidget(self.lineEdit_8)
self.lineEdit_11 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_11.setObjectName("lineEdit_11")
self.verticalLayout.addWidget(self.lineEdit_11)
self.lineEdit_9 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_9.setObjectName("lineEdit_9")
self.verticalLayout.addWidget(self.lineEdit_9)
self.lineEdit_10 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_10.setObjectName("lineEdit_10")
self.verticalLayout.addWidget(self.lineEdit_10)
self.lineEdit_22 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_22.setObjectName("lineEdit_22")
self.verticalLayout.addWidget(self.lineEdit_22)
self.lineEdit_23 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_23.setObjectName("lineEdit_23")
self.verticalLayout.addWidget(self.lineEdit_23)
self.lineEdit_24 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_24.setObjectName("lineEdit_24")
self.verticalLayout.addWidget(self.lineEdit_24)
self.lineEdit_25 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_25.setObjectName("lineEdit_25")
self.verticalLayout.addWidget(self.lineEdit_25)
self.lineEdit_26 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_26.setObjectName("lineEdit_26")
self.verticalLayout.addWidget(self.lineEdit_26)
self.lineEdit_27 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_27.setObjectName("lineEdit_27")
self.verticalLayout.addWidget(self.lineEdit_27)
self.comboBox_2 = QtWidgets.QComboBox(parent=self.scrollAreaWidgetContents)
self.comboBox_2.setObjectName("comboBox_2")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.verticalLayout.addWidget(self.comboBox_2)
self.lineEdit_12 = QtWidgets.QLineEdit(parent=self.scrollAreaWidgetContents)
self.lineEdit_12.setObjectName("lineEdit_12")
self.verticalLayout.addWidget(self.lineEdit_12)
self.comboBox = QtWidgets.QComboBox(parent=self.scrollAreaWidgetContents)
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.verticalLayout.addWidget(self.comboBox)
self.gridLayout_4.addLayout(self.verticalLayout, 2, 0, 1, 1)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.gridLayout.addWidget(self.scrollArea, 2, 0, 1, 1)
self.pushButton = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.pushButton, 3, 0, 1, 1)
AutoDraft.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(parent=AutoDraft)
self.statusbar.setObjectName("statusbar")
AutoDraft.setStatusBar(self.statusbar)
self.action = QtGui.QAction(parent=AutoDraft)
self.action.setObjectName("action")
self.action_PDF = QtGui.QAction(parent=AutoDraft)
self.action_PDF.setObjectName("action_PDF")
self.action_3 = QtGui.QAction(parent=AutoDraft)
self.action_3.setObjectName("action_3")
self.action_5 = QtGui.QAction(parent=AutoDraft)
self.action_5.setObjectName("action_5")
self.action_6 = QtGui.QAction(parent=AutoDraft)
self.action_6.setObjectName("action_6")
self.action_7 = QtGui.QAction(parent=AutoDraft)
self.action_7.setObjectName("action_7")
self.action_8 = QtGui.QAction(parent=AutoDraft)
self.action_8.setObjectName("action_8")
self.action_10 = QtGui.QAction(parent=AutoDraft)
self.action_10.setObjectName("action_10")
self.retranslateUi(AutoDraft)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(AutoDraft)
def retranslateUi(self, AutoDraft):
_translate = QtCore.QCoreApplication.translate
AutoDraft.setWindowTitle(_translate("AutoDraft", "AutoDraft (Demo)"))
self.lineEdit.setPlaceholderText(_translate("AutoDraft", "Имя, Фамилия"))
self.lineEdit_3.setPlaceholderText(_translate("AutoDraft", "Место рождения"))
self.lineEdit_2.setPlaceholderText(_translate("AutoDraft", "Дата рождения"))
self.lineEdit_4.setPlaceholderText(_translate("AutoDraft", "Телефон"))
self.lineEdit_20.setPlaceholderText(_translate("AutoDraft", "Дата выдачи удостоверения"))
self.lineEdit_17.setPlaceholderText(_translate("AutoDraft", "Данные паспорта"))
self.lineEdit_19.setPlaceholderText(_translate("AutoDraft", "Водительское удостоверение"))
self.lineEdit_18.setPlaceholderText(_translate("AutoDraft", "Дата выдачи паспорта"))
self.lineEdit_28.setPlaceholderText(_translate("AutoDraft", "Адрес"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("AutoDraft", "Первый водитель"))
self.lineEdit_15.setPlaceholderText(_translate("AutoDraft", "Водительское удостоверение"))
self.lineEdit_14.setPlaceholderText(_translate("AutoDraft", "Дата выдача паспорта"))
self.lineEdit_13.setPlaceholderText(_translate("AutoDraft", "Данные паспорта"))
self.lineEdit_6.setPlaceholderText(_translate("AutoDraft", "Телефон (второго водителя)"))
self.lineEdit_5.setPlaceholderText(_translate("AutoDraft", "Дата рождения (второго водителя)"))
self.lineEdit_16.setPlaceholderText(_translate("AutoDraft", "Дата выдачи удостоверения"))
self.lineEdit_7.setPlaceholderText(_translate("AutoDraft", "Второй водитель"))
self.lineEdit_21.setPlaceholderText(_translate("AutoDraft", "Адрес"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("AutoDraft", "Второй водитель"))
self.lineEdit_8.setPlaceholderText(_translate("AutoDraft", "Тип автомобиля"))
self.lineEdit_11.setPlaceholderText(_translate("AutoDraft", "Регистрационный номер"))
self.lineEdit_9.setPlaceholderText(_translate("AutoDraft", "Начало аренды"))
self.lineEdit_10.setPlaceholderText(_translate("AutoDraft", "Конец аренды"))
self.lineEdit_22.setPlaceholderText(_translate("AutoDraft", "Дней"))
self.lineEdit_23.setPlaceholderText(_translate("AutoDraft", "Место сдачи"))
self.lineEdit_24.setPlaceholderText(_translate("AutoDraft", "Место возврата"))
self.lineEdit_25.setPlaceholderText(_translate("AutoDraft", "Цена"))
self.lineEdit_26.setPlaceholderText(_translate("AutoDraft", "Итого"))
self.lineEdit_27.setPlaceholderText(_translate("AutoDraft", "Депозит"))
self.comboBox_2.setItemText(0, _translate("AutoDraft", "BENZIN"))
self.comboBox_2.setItemText(1, _translate("AutoDraft", "DIZEL"))
self.lineEdit_12.setPlaceholderText(_translate("AutoDraft", "Вид оплаты"))
self.comboBox.setItemText(0, _translate("AutoDraft", "DA/YES"))
self.comboBox.setItemText(1, _translate("AutoDraft", "NE/NO"))
self.pushButton.setText(_translate("AutoDraft", "Заполнить договор"))
self.action.setText(_translate("AutoDraft", "Заполнить договор"))
self.action_PDF.setText(_translate("AutoDraft", "Конвертировать в PDF"))
self.action_3.setText(_translate("AutoDraft", "Печать"))
self.action_5.setText(_translate("AutoDraft", "Закрыть"))
self.action_6.setText(_translate("AutoDraft", "Новый договор"))
self.action_7.setText(_translate("AutoDraft", "Заполнить договор"))
self.action_8.setText(_translate("AutoDraft", "Лицензия"))
self.action_10.setText(_translate("AutoDraft", "О программе"))
Contract_new.docx: https://docs.google.com/document/d/1ahhiUEty41r1JuDPBbzY5F11oWSSvnuk/edit?usp=sharing&ouid=115036232705488001672&rtpof=true&sd=true