Как реализовать сохранения данных в отдельных сохранениях?
Имеется таблица, в которой необходимо вводить определенный тип данных (то есть в колонках № только цифры, в ФИО только буквы, в телефоне только цифры и спец.символы, в адресе цифры и буквы, в дате регистрации должен вставляться dataEdit ну и в графе активность да или нет.
После чего эти данные должны сохранятся по action с названием Сохранить как... и открывается по кнопке Открыть, причем количество столбцов меняется (это я смог сделать). \
А если данные по данному сохранению уже имеются, то по нажатию на кнопку сохранить как эти данные просто перезаписываются (лучше реализовать сохранение данных в файле .txt).
Понимаю что писать много, так что могу поставить как конкурсный.
main.py
from PyQt5 import QtCore, QtGui, QtWidgets
from base import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.buttonAdd)
self.pushButton_2.clicked.connect(self.buttonDelete)
def buttonAdd(self):
rowPosition = self.tableWidget.rowCount()
self.tableWidget.insertRow(rowPosition)
def buttonDelete(self):
if self.tableWidget.rowCount() > 0:
self.tableWidget.removeRow(self.tableWidget.rowCount() - 1)
def actionSave(self):
pass
def actionOpen(self):
pass
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
base.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(407, 353)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_3.setObjectName("gridLayout_3")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayout = QtWidgets.QGridLayout(self.tab)
self.gridLayout.setObjectName("gridLayout")
self.tableWidget = QtWidgets.QTableWidget(self.tab)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(8)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
self.tableWidget.horizontalHeader().setDefaultSectionSize(120)
self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
self.groupBox = QtWidgets.QGroupBox(self.tab)
self.groupBox.setObjectName("groupBox")
self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout_4.setObjectName("gridLayout_4")
self.pushButton = QtWidgets.QPushButton(self.groupBox)
self.pushButton.setObjectName("pushButton")
self.gridLayout_4.addWidget(self.pushButton, 0, 0, 1, 1)
self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout_4.addWidget(self.pushButton_2, 1, 0, 1, 1)
self.gridLayout.addWidget(self.groupBox, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.gridLayout_5 = QtWidgets.QGridLayout(self.tab_2)
self.gridLayout_5.setObjectName("gridLayout_5")
self.groupBox_2 = QtWidgets.QGroupBox(self.tab_2)
self.groupBox_2.setObjectName("groupBox_2")
self.gridLayout_5.addWidget(self.groupBox_2, 1, 0, 1, 1)
self.groupBox_3 = QtWidgets.QGroupBox(self.tab_2)
self.groupBox_3.setObjectName("groupBox_3")
self.gridLayout_5.addWidget(self.groupBox_3, 2, 0, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout_3.addWidget(self.tabWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 407, 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.action = QtWidgets.QAction(MainWindow)
self.action.setObjectName("action")
self.action_2 = QtWidgets.QAction(MainWindow)
self.action_2.setObjectName("action_2")
self.menu.addAction(self.action)
self.menu.addAction(self.action_2)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "№"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Фамилия"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Имя"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "Отечество"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "Адрес"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "Номер телефона"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "Дата регистрации"))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(_translate("MainWindow", "Активность"))
self.groupBox.setTitle(_translate("MainWindow", "Настройки таблицы"))
self.pushButton.setText(_translate("MainWindow", "Добавить строку"))
self.pushButton_2.setText(_translate("MainWindow", "Удалить строку"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Таблица"))
self.groupBox_2.setTitle(_translate("MainWindow", "Ввод запроса"))
self.groupBox_3.setTitle(_translate("MainWindow", "Результат вопроса"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Поиск данных"))
self.menu.setTitle(_translate("MainWindow", "Файл"))
self.action.setText(_translate("MainWindow", "Открыть"))
self.action_2.setText(_translate("MainWindow", "Сохранить как..."))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Ответы (1 шт):
Я не знаю зачем вы так подробно расписали структуру вашей предполагаемой таблицы.
Покажу вам как обычно закачивают в tableWidget данные из .csv и как сохраняют данные из tableWidget в .csv файл.
import os # +++
import csv # +++
from PyQt5 import QtCore, QtGui, QtWidgets
#from base import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(407, 353)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_3.setObjectName("gridLayout_3")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayout = QtWidgets.QGridLayout(self.tab)
self.gridLayout.setObjectName("gridLayout")
self.tableWidget = QtWidgets.QTableWidget(self.tab)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(8)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
self.tableWidget.horizontalHeader().setDefaultSectionSize(120)
self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
self.groupBox = QtWidgets.QGroupBox(self.tab)
self.groupBox.setObjectName("groupBox")
self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout_4.setObjectName("gridLayout_4")
self.pushButton = QtWidgets.QPushButton(self.groupBox)
self.pushButton.setObjectName("pushButton")
self.gridLayout_4.addWidget(self.pushButton, 0, 0, 1, 1)
self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout_4.addWidget(self.pushButton_2, 1, 0, 1, 1)
self.gridLayout.addWidget(self.groupBox, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.gridLayout_5 = QtWidgets.QGridLayout(self.tab_2)
self.gridLayout_5.setObjectName("gridLayout_5")
self.groupBox_2 = QtWidgets.QGroupBox(self.tab_2)
self.groupBox_2.setObjectName("groupBox_2")
self.gridLayout_5.addWidget(self.groupBox_2, 1, 0, 1, 1)
self.groupBox_3 = QtWidgets.QGroupBox(self.tab_2)
self.groupBox_3.setObjectName("groupBox_3")
self.gridLayout_5.addWidget(self.groupBox_3, 2, 0, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout_3.addWidget(self.tabWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 407, 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.action = QtWidgets.QAction(MainWindow)
self.action.setObjectName("action")
self.action_2 = QtWidgets.QAction(MainWindow)
self.action_2.setObjectName("action_2")
self.menu.addAction(self.action)
self.menu.addAction(self.action_2)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "№"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Фамилия"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Имя"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "Отечество"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "Адрес"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "Номер телефона"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "Дата регистрации"))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(_translate("MainWindow", "Активность"))
self.groupBox.setTitle(_translate("MainWindow", "Настройки таблицы"))
self.pushButton.setText(_translate("MainWindow", "Добавить строку"))
self.pushButton_2.setText(_translate("MainWindow", "Удалить строку"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Таблица"))
self.groupBox_2.setTitle(_translate("MainWindow", "Ввод запроса"))
self.groupBox_3.setTitle(_translate("MainWindow", "Результат вопроса"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Поиск данных"))
self.menu.setTitle(_translate("MainWindow", "Файл"))
self.action.setText(_translate("MainWindow", "Открыть"))
self.action_2.setText(_translate("MainWindow", "Сохранить как..."))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.buttonAdd)
self.pushButton_2.clicked.connect(self.buttonDelete)
self.action.triggered.connect(self.actionOpen) # +++
self.action_2.triggered.connect(self.actionSave) # +++
def buttonAdd(self):
rowPosition = self.tableWidget.rowCount()
self.tableWidget.insertRow(rowPosition)
def buttonDelete(self):
if self.tableWidget.rowCount() > 0:
self.tableWidget.removeRow(self.tableWidget.rowCount() - 1)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def actionSave(self):
path = QtWidgets.QFileDialog.getSaveFileName(
self,
'Save CSV',
os.getenv('HOME'),
'CSV(*.csv)')
if path[0] != '':
with open(path[0], 'w', newline='') as csv_file:
writer = csv.writer(csv_file, dialect='excel')
for row in range(self.tableWidget.rowCount()):
row_data = []
for column in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(row, column)
if item is not None:
row_data.append(item.text())
else:
row_data.append('')
writer.writerow(row_data)
def actionOpen(self):
path, _ = QtWidgets.QFileDialog.getOpenFileName(
self, 'Open CSV', '.', 'CSV(*.csv)')
if not path:
return
with open(path, newline='') as csv_file:
self.tableWidget.setRowCount(0)
self.tableWidget.setColumnCount(8)
my_file = csv.reader(csv_file, delimiter=',', quotechar='|')
for row_data in my_file:
row = self.tableWidget.rowCount()
self.tableWidget.insertRow(row)
if len(row_data) > 8:
self.tableWidget.setColumnCount(len(row_data))
for column, stuff in enumerate(row_data):
item = QtWidgets.QTableWidgetItem(stuff)
self.tableWidget.setItem(row, column, item)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(1020, 353)
w.show()
sys.exit(app.exec_())
