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", "删除一行"))

 

posted @ 2019-02-26 21:26  河岸瓶风  阅读(15344)  评论(0编辑  收藏  举报