PyQt5-TableWidget 表格视图
基于PyQt5 postgreSQL实现简单的数据插入、数据表格查询。
运行前需要安装psycopg2 模块,配置好postgerSQL。
先看效果图:
第1列为日期时间、第2列为自增1的编号、第3到第5列为设定的字符串。数据查询时,根据创建表的设定框名字查询该表的数据。
主程序代码
1 # -*- coding: utf-8 -*- 2 import sys 3 import psycopg2 4 import time,datetime 5 from PyQt5.QtWidgets import QApplication, QMainWindow,QWidget,QMessageBox,QTableWidgetItem 6 from TableView_test import Ui_dataBaseForm 7 8 9 class MyMain(QMainWindow,Ui_dataBaseForm): 10 conn = psycopg2.connect(database="postgres", user="postgres", password="0818", host="localhost", port="5432") 11 cursor = conn.cursor() 12 13 def __init__(self): 14 super().__init__() 15 self.setupUi(self) ## 初始化运行A窗口类下的 setupUi 函数 16 self.db_create.clicked.connect(self.createBase) #创建数据库表 17 self.db_delete.clicked.connect(self.deleteBase) #删除表格 18 self.db_insert.clicked.connect(self.dbWrit) #插入数据 19 self.db_delete_row.clicked.connect(self.deleteRow) #删除行 20 self.date_select.clicked.connect(self.dateSelect) #查询输出 21 self.db_export.clicked.connect(self.excelExport) #导出CSV 22 23 24 25 #报警提示框 26 def alarmMessageBox(self,alarm): 27 self.alarm = alarm 28 reply = QMessageBox.information(self, "提示框", self.alarm, QMessageBox.Yes , 29 QMessageBox.Yes) 30 31 #创建表格 32 def createBase(self): 33 try: 34 self.dbName = self.db_create_edit.text()#设置表名 35 MyMain.cursor.execute("CREATE TABLE %s ( \ 36 date timestamp without time zone NOT NULL, \ 37 id serial NOT NULL, \ 38 line1 CHAR(6) NOT NULL,\ 39 line2 CHAR(6) NOT NULL,\ 40 line3 CHAR(6) NOT NULL,\ 41 PRIMARY KEY (date));" % (self.dbName)) ## 创建表SQL命令 42 MyMain.conn.commit() 43 self.alarmMessageBox("创建表格成功!") 44 except Exception as exc: 45 self.alarmMessageBox(str(exc)) ##触发报警框 46 MyMain.conn.commit() ## 给数据库,开启新的事物块。 47 48 #删除表格 49 def deleteBase(self): 50 try: 51 self.dbName = self.db_delete_edit.text()#设置表名 52 MyMain.cursor.execute("DROP TABLE %s " % (self.dbName)) ## 创建execu test 数据库SQL命令 53 MyMain.conn.commit() 54 self.alarmMessageBox("删除表格完成!") 55 except Exception as exc: 56 self.alarmMessageBox(str(exc)) 57 MyMain.conn.commit() 58 59 #写入数据 60 def dbWrit(self): 61 self.dbName = self.db_create_edit.text() 62 self.text = self.db_writ.text().split() #读取界面框数据 63 # print(self.text) 64 print(len(self.text)) 65 if len(self.text) != 3: 66 self.alarmMessageBox("数据为 %d 个,不符合要求。" % (len(self.text))) 67 else: 68 try: 69 MyMain.cursor.execute( "INSERT INTO {0} (date,line1,line2,line3) VALUES((SELECT now()),'{1}', '{2}' , '{3}')" 70 .format(self.dbName, self.text[0],self.text[1], self.text[2])) 71 MyMain.conn.commit() 72 except Exception as exc: 73 self.alarmMessageBox(str(exc)) 74 MyMain.conn.commit() 75 #删除最后一行 76 def deleteRow(self): 77 self.dbName = self.db_create_edit.text() 78 try: 79 MyMain.cursor.execute("DELETE FROM {0} WHERE date= (SELECT max(date) FROM {0})".format(self.dbName)) 80 MyMain.conn.commit() 81 self.alarmMessageBox("删除最后一行成功!") 82 except Exception as exc: 83 self.alarmMessageBox(str(exc)) 84 MyMain.conn.commit() 85 #查询的条件 86 def rogatoryCondition(self): 87 self.startTime = self.date_start.dateTime().toString("yyyy-MM-dd hh:mm:ss") 88 self.endTime = self.date_end.dateTime().toString("yyyy-MM-dd hh:mm:ss") 89 90 self.dbName = self.db_create_edit.text() 91 self.select = "SELECT date, id ,line1,line2,line3 FROM {0} WHERE date > '{1}' and date < '{2}'".format( 92 self.dbName, 93 self.startTime, 94 self.endTime) 95 return self.select 96 97 #查询输出 98 def dateSelect(self): 99 self.condition = self.rogatoryCondition() 100 try: 101 MyMain.cursor.execute(self.condition) 102 self.data = MyMain.cursor.fetchall() 103 self.rowNum = len(self.data) #获取查询到的行数 104 self.columnNum = len(self.data[0]) #获取查询到的列数 105 106 self.dataView.setRowCount(self.rowNum) #设置表格行数 107 self.dataView.setColumnCount(self.columnNum) 108 109 for i, da in enumerate( self.data): 110 for j in range(self.columnNum): 111 self.itemContent = QTableWidgetItem(( '%s' ) % (da[j])) 112 self.dataView.setItem(i,j,self.itemContent ) 113 self.alarmMessageBox("查询完成!") 114 except Exception as exc: 115 self.alarmMessageBox(str(exc)) 116 MyMain.conn.commit() 117 118 def excelExport(self): 119 self.condition = self.rogatoryCondition() 120 MyMain.cursor.execute("COPY( {0} ) TO 'D:/ExceptionData.csv' with csv header".format(self.condition)) 121 self.alarmMessageBox("导出成功!") 122 123 124 125 126 127 128 129 if __name__ == "__main__": 130 app = QApplication(sys.argv) 131 A1 = MyMain() 132 A1.show() 133 sys.exit(app.exec_())
UI文件代码,TableView_test.py 代码
1 # -*- coding: utf-8 -*- 2 3 # Form implementation generated from reading ui file 'TableView_test.ui' 4 # 5 # Created by: PyQt5 UI code generator 5.11.3 6 # 7 # WARNING! All changes made in this file will be lost! 8 9 from PyQt5 import QtCore, QtGui, QtWidgets 10 11 class Ui_dataBaseForm(object): 12 def setupUi(self, dataBaseForm): 13 dataBaseForm.setObjectName("dataBaseForm") 14 dataBaseForm.resize(1127, 754) 15 font = QtGui.QFont() 16 font.setBold(False) 17 font.setWeight(50) 18 dataBaseForm.setFont(font) 19 dataBaseForm.setAutoFillBackground(False) 20 self.groupBox = QtWidgets.QGroupBox(dataBaseForm) 21 self.groupBox.setGeometry(QtCore.QRect(870, 80, 231, 141)) 22 font = QtGui.QFont() 23 font.setBold(False) 24 font.setWeight(50) 25 self.groupBox.setFont(font) 26 self.groupBox.setStyleSheet("") 27 self.groupBox.setObjectName("groupBox") 28 self.layoutWidget = QtWidgets.QWidget(self.groupBox) 29 self.layoutWidget.setGeometry(QtCore.QRect(10, 20, 211, 101)) 30 self.layoutWidget.setObjectName("layoutWidget") 31 self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget) 32 self.gridLayout.setContentsMargins(0, 0, 0, 0) 33 self.gridLayout.setObjectName("gridLayout") 34 self.db_create = QtWidgets.QPushButton(self.layoutWidget) 35 self.db_create.setObjectName("db_create") 36 self.gridLayout.addWidget(self.db_create, 0, 1, 1, 1) 37 self.db_delete_edit = QtWidgets.QLineEdit(self.layoutWidget) 38 font = QtGui.QFont() 39 font.setFamily("微软雅黑") 40 font.setPointSize(12) 41 font.setBold(False) 42 font.setItalic(False) 43 font.setWeight(50) 44 self.db_delete_edit.setFont(font) 45 self.db_delete_edit.setLayoutDirection(QtCore.Qt.LeftToRight) 46 self.db_delete_edit.setStyleSheet("") 47 self.db_delete_edit.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) 48 self.db_delete_edit.setObjectName("db_delete_edit") 49 self.gridLayout.addWidget(self.db_delete_edit, 1, 0, 1, 1) 50 self.db_delete = QtWidgets.QPushButton(self.layoutWidget) 51 self.db_delete.setObjectName("db_delete") 52 self.gridLayout.addWidget(self.db_delete, 1, 1, 1, 1) 53 self.db_create_edit = QtWidgets.QLineEdit(self.layoutWidget) 54 font = QtGui.QFont() 55 font.setFamily("微软雅黑") 56 font.setPointSize(12) 57 font.setBold(False) 58 font.setItalic(False) 59 font.setWeight(50) 60 self.db_create_edit.setFont(font) 61 self.db_create_edit.setLayoutDirection(QtCore.Qt.LeftToRight) 62 self.db_create_edit.setStyleSheet("") 63 self.db_create_edit.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) 64 self.db_create_edit.setObjectName("db_create_edit") 65 self.gridLayout.addWidget(self.db_create_edit, 0, 0, 1, 1) 66 self.groupBox_2 = QtWidgets.QGroupBox(dataBaseForm) 67 self.groupBox_2.setGeometry(QtCore.QRect(870, 270, 231, 171)) 68 self.groupBox_2.setObjectName("groupBox_2") 69 self.layoutWidget1 = QtWidgets.QWidget(self.groupBox_2) 70 self.layoutWidget1.setGeometry(QtCore.QRect(10, 20, 211, 141)) 71 self.layoutWidget1.setObjectName("layoutWidget1") 72 self.gridLayout_2 = QtWidgets.QGridLayout(self.layoutWidget1) 73 self.gridLayout_2.setContentsMargins(0, 0, 0, 0) 74 self.gridLayout_2.setObjectName("gridLayout_2") 75 self.A_title_3 = QtWidgets.QLabel(self.layoutWidget1) 76 font = QtGui.QFont() 77 font.setPointSize(11) 78 self.A_title_3.setFont(font) 79 self.A_title_3.setObjectName("A_title_3") 80 self.gridLayout_2.addWidget(self.A_title_3, 3, 0, 1, 1) 81 self.date_select = QtWidgets.QPushButton(self.layoutWidget1) 82 self.date_select.setObjectName("date_select") 83 self.gridLayout_2.addWidget(self.date_select, 5, 0, 1, 1) 84 self.A_title_2 = QtWidgets.QLabel(self.layoutWidget1) 85 font = QtGui.QFont() 86 font.setPointSize(11) 87 self.A_title_2.setFont(font) 88 self.A_title_2.setObjectName("A_title_2") 89 self.gridLayout_2.addWidget(self.A_title_2, 0, 0, 1, 1) 90 self.date_start = QtWidgets.QDateTimeEdit(self.layoutWidget1) 91 font = QtGui.QFont() 92 font.setPointSize(12) 93 font.setBold(True) 94 font.setWeight(75) 95 self.date_start.setFont(font) 96 self.date_start.setDateTime(QtCore.QDateTime(QtCore.QDate(2019, 1, 1), QtCore.QTime(3, 2, 3))) 97 self.date_start.setCalendarPopup(True) 98 self.date_start.setObjectName("date_start") 99 self.gridLayout_2.addWidget(self.date_start, 1, 0, 1, 1) 100 self.date_end = QtWidgets.QDateTimeEdit(self.layoutWidget1) 101 font = QtGui.QFont() 102 font.setPointSize(12) 103 font.setBold(True) 104 font.setWeight(75) 105 self.date_end.setFont(font) 106 self.date_end.setDateTime(QtCore.QDateTime(QtCore.QDate(2019, 3, 1), QtCore.QTime(2, 7, 11))) 107 self.date_end.setCalendarPopup(True) 108 self.date_end.setObjectName("date_end") 109 self.gridLayout_2.addWidget(self.date_end, 4, 0, 1, 1) 110 self.groupBox_3 = QtWidgets.QGroupBox(dataBaseForm) 111 self.groupBox_3.setGeometry(QtCore.QRect(870, 450, 231, 171)) 112 self.groupBox_3.setObjectName("groupBox_3") 113 self.layoutWidget2 = QtWidgets.QWidget(self.groupBox_3) 114 self.layoutWidget2.setGeometry(QtCore.QRect(10, 20, 211, 111)) 115 self.layoutWidget2.setObjectName("layoutWidget2") 116 self.gridLayout_3 = QtWidgets.QGridLayout(self.layoutWidget2) 117 self.gridLayout_3.setContentsMargins(0, 0, 0, 0) 118 self.gridLayout_3.setObjectName("gridLayout_3") 119 self.db_print = QtWidgets.QPushButton(self.layoutWidget2) 120 self.db_print.setObjectName("db_print") 121 self.gridLayout_3.addWidget(self.db_print, 1, 0, 1, 1) 122 self.db_export = QtWidgets.QPushButton(self.layoutWidget2) 123 self.db_export.setObjectName("db_export") 124 self.gridLayout_3.addWidget(self.db_export, 0, 0, 1, 1) 125 self.layoutWidget3 = QtWidgets.QWidget(dataBaseForm) 126 self.layoutWidget3.setGeometry(QtCore.QRect(10, 630, 851, 33)) 127 self.layoutWidget3.setObjectName("layoutWidget3") 128 self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget3) 129 self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) 130 self.horizontalLayout_2.setObjectName("horizontalLayout_2") 131 self.A_title = QtWidgets.QLabel(self.layoutWidget3) 132 font = QtGui.QFont() 133 font.setPointSize(10) 134 self.A_title.setFont(font) 135 self.A_title.setObjectName("A_title") 136 self.horizontalLayout_2.addWidget(self.A_title) 137 self.db_writ = QtWidgets.QLineEdit(self.layoutWidget3) 138 font = QtGui.QFont() 139 font.setFamily("新宋体") 140 font.setPointSize(10) 141 font.setBold(False) 142 font.setItalic(False) 143 font.setWeight(50) 144 self.db_writ.setFont(font) 145 self.db_writ.setLayoutDirection(QtCore.Qt.LeftToRight) 146 self.db_writ.setStyleSheet("") 147 self.db_writ.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) 148 self.db_writ.setObjectName("db_writ") 149 self.horizontalLayout_2.addWidget(self.db_writ) 150 self.db_insert = QtWidgets.QPushButton(self.layoutWidget3) 151 self.db_insert.setObjectName("db_insert") 152 self.horizontalLayout_2.addWidget(self.db_insert) 153 self.db_delete_row = QtWidgets.QPushButton(self.layoutWidget3) 154 self.db_delete_row.setObjectName("db_delete_row") 155 self.horizontalLayout_2.addWidget(self.db_delete_row) 156 self.dataView = QtWidgets.QTableWidget(dataBaseForm) 157 self.dataView.setGeometry(QtCore.QRect(10, 80, 851, 541)) 158 self.dataView.setObjectName("dataView") 159 #self.dataView.setColumnCount(0) 160 #self.dataView.setRowCount(0) 161 162 self.retranslateUi(dataBaseForm) 163 QtCore.QMetaObject.connectSlotsByName(dataBaseForm) 164 165 def retranslateUi(self, dataBaseForm): 166 _translate = QtCore.QCoreApplication.translate 167 dataBaseForm.setWindowTitle(_translate("dataBaseForm", "TableView数据库视图-liangfu")) 168 self.groupBox.setTitle(_translate("dataBaseForm", "基本操作")) 169 self.db_create.setText(_translate("dataBaseForm", "创建表格")) 170 self.db_delete_edit.setText(_translate("dataBaseForm", "dataBase")) 171 self.db_delete.setText(_translate("dataBaseForm", "删除表格")) 172 self.db_create_edit.setText(_translate("dataBaseForm", "dataBase")) 173 self.groupBox_2.setTitle(_translate("dataBaseForm", "查找数据")) 174 self.A_title_3.setText(_translate("dataBaseForm", "结束时间:")) 175 self.date_select.setText(_translate("dataBaseForm", "查询")) 176 self.A_title_2.setText(_translate("dataBaseForm", "开始时间:")) 177 self.date_start.setDisplayFormat(_translate("dataBaseForm", "yyyy-MM-dd hh:mm:ss")) 178 self.date_end.setDisplayFormat(_translate("dataBaseForm", "yyyy-MM-dd hh:mm:ss")) 179 self.groupBox_3.setTitle(_translate("dataBaseForm", "导出保存")) 180 self.db_print.setText(_translate("dataBaseForm", "打印")) 181 self.db_export.setText(_translate("dataBaseForm", "导出为Excel文档")) 182 self.A_title.setText(_translate("dataBaseForm", "输入数值(空格隔开):")) 183 self.db_writ.setText(_translate("dataBaseForm", "0.1023 0.1233 0.1214")) 184 self.db_insert.setText(_translate("dataBaseForm", "插入一行")) 185 self.db_delete_row.setText(_translate("dataBaseForm", "删除一行"))