PyQt5-TableWidget 表格视图
基于PyQt5 postgreSQL实现简单的数据插入、数据表格查询。
运行前需要安装psycopg2 模块,配置好postgerSQL。
先看效果图:
第1列为日期时间、第2列为自增1的编号、第3到第5列为设定的字符串。数据查询时,根据创建表的设定框名字查询该表的数据。
主程序代码
# -*- coding: utf-8 -*-
import sys
import psycopg2
import time,datetime
from PyQt5.QtWidgets import QApplication, QMainWindow,QWidget,QMessageBox,QTableWidgetItem
from TableView_test import Ui_dataBaseForm class MyMain(QMainWindow,Ui_dataBaseForm):
conn = psycopg2.connect(database="postgres", user="postgres", password="", host="localhost", port="")
cursor = conn.cursor() def __init__(self):
super().__init__()
self.setupUi(self) ## 初始化运行A窗口类下的 setupUi 函数
self.db_create.clicked.connect(self.createBase) #创建数据库表
self.db_delete.clicked.connect(self.deleteBase) #删除表格
self.db_insert.clicked.connect(self.dbWrit) #插入数据
self.db_delete_row.clicked.connect(self.deleteRow) #删除行
self.date_select.clicked.connect(self.dateSelect) #查询输出
self.db_export.clicked.connect(self.excelExport) #导出CSV #报警提示框
def alarmMessageBox(self,alarm):
self.alarm = alarm
reply = QMessageBox.information(self, "提示框", self.alarm, QMessageBox.Yes ,
QMessageBox.Yes) #创建表格
def createBase(self):
try:
self.dbName = self.db_create_edit.text()#设置表名
MyMain.cursor.execute("CREATE TABLE %s ( \
date timestamp without time zone NOT NULL, \
id serial NOT NULL, \
line1 CHAR(6) NOT NULL,\
line2 CHAR(6) NOT NULL,\
line3 CHAR(6) NOT NULL,\
PRIMARY KEY (date));" % (self.dbName)) ## 创建表SQL命令
MyMain.conn.commit()
self.alarmMessageBox("创建表格成功!")
except Exception as exc:
self.alarmMessageBox(str(exc)) ##触发报警框
MyMain.conn.commit() ## 给数据库,开启新的事物块。 #删除表格
def deleteBase(self):
try:
self.dbName = self.db_delete_edit.text()#设置表名
MyMain.cursor.execute("DROP TABLE %s " % (self.dbName)) ## 创建execu test 数据库SQL命令
MyMain.conn.commit()
self.alarmMessageBox("删除表格完成!")
except Exception as exc:
self.alarmMessageBox(str(exc))
MyMain.conn.commit() #写入数据
def dbWrit(self):
self.dbName = self.db_create_edit.text()
self.text = self.db_writ.text().split() #读取界面框数据
# print(self.text)
print(len(self.text))
if len(self.text) != 3:
self.alarmMessageBox("数据为 %d 个,不符合要求。" % (len(self.text)))
else:
try:
MyMain.cursor.execute( "INSERT INTO {0} (date,line1,line2,line3) VALUES((SELECT now()),'{1}', '{2}' , '{3}')"
.format(self.dbName, self.text[0],self.text[1], self.text[2]))
MyMain.conn.commit()
except Exception as exc:
self.alarmMessageBox(str(exc))
MyMain.conn.commit()
#删除最后一行
def deleteRow(self):
self.dbName = self.db_create_edit.text()
try:
MyMain.cursor.execute("DELETE FROM {0} WHERE date= (SELECT max(date) FROM {0})".format(self.dbName))
MyMain.conn.commit()
self.alarmMessageBox("删除最后一行成功!")
except Exception as exc:
self.alarmMessageBox(str(exc))
MyMain.conn.commit()
#查询的条件
def rogatoryCondition(self):
self.startTime = self.date_start.dateTime().toString("yyyy-MM-dd hh:mm:ss")
self.endTime = self.date_end.dateTime().toString("yyyy-MM-dd hh:mm:ss") self.dbName = self.db_create_edit.text()
self.select = "SELECT date, id ,line1,line2,line3 FROM {0} WHERE date > '{1}' and date < '{2}'".format(
self.dbName,
self.startTime,
self.endTime)
return self.select #查询输出
def dateSelect(self):
self.condition = self.rogatoryCondition()
try:
MyMain.cursor.execute(self.condition)
self.data = MyMain.cursor.fetchall()
self.rowNum = len(self.data) #获取查询到的行数
self.columnNum = len(self.data[0]) #获取查询到的列数 self.dataView.setRowCount(self.rowNum) #设置表格行数
self.dataView.setColumnCount(self.columnNum) for i, da in enumerate( self.data):
for j in range(self.columnNum):
self.itemContent = QTableWidgetItem(( '%s' ) % (da[j]))
self.dataView.setItem(i,j,self.itemContent )
self.alarmMessageBox("查询完成!")
except Exception as exc:
self.alarmMessageBox(str(exc))
MyMain.conn.commit() def excelExport(self):
self.condition = self.rogatoryCondition()
MyMain.cursor.execute("COPY( {0} ) TO 'D:/ExceptionData.csv' with csv header".format(self.condition))
self.alarmMessageBox("导出成功!") if __name__ == "__main__":
app = QApplication(sys.argv)
A1 = MyMain()
A1.show()
sys.exit(app.exec_())
UI文件代码,TableView_test.py 代码
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'TableView_test.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_dataBaseForm(object):
def setupUi(self, dataBaseForm):
dataBaseForm.setObjectName("dataBaseForm")
dataBaseForm.resize(1127, 754)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
dataBaseForm.setFont(font)
dataBaseForm.setAutoFillBackground(False)
self.groupBox = QtWidgets.QGroupBox(dataBaseForm)
self.groupBox.setGeometry(QtCore.QRect(870, 80, 231, 141))
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.groupBox.setFont(font)
self.groupBox.setStyleSheet("")
self.groupBox.setObjectName("groupBox")
self.layoutWidget = QtWidgets.QWidget(self.groupBox)
self.layoutWidget.setGeometry(QtCore.QRect(10, 20, 211, 101))
self.layoutWidget.setObjectName("layoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.db_create = QtWidgets.QPushButton(self.layoutWidget)
self.db_create.setObjectName("db_create")
self.gridLayout.addWidget(self.db_create, 0, 1, 1, 1)
self.db_delete_edit = QtWidgets.QLineEdit(self.layoutWidget)
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(12)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.db_delete_edit.setFont(font)
self.db_delete_edit.setLayoutDirection(QtCore.Qt.LeftToRight)
self.db_delete_edit.setStyleSheet("")
self.db_delete_edit.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.db_delete_edit.setObjectName("db_delete_edit")
self.gridLayout.addWidget(self.db_delete_edit, 1, 0, 1, 1)
self.db_delete = QtWidgets.QPushButton(self.layoutWidget)
self.db_delete.setObjectName("db_delete")
self.gridLayout.addWidget(self.db_delete, 1, 1, 1, 1)
self.db_create_edit = QtWidgets.QLineEdit(self.layoutWidget)
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(12)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.db_create_edit.setFont(font)
self.db_create_edit.setLayoutDirection(QtCore.Qt.LeftToRight)
self.db_create_edit.setStyleSheet("")
self.db_create_edit.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.db_create_edit.setObjectName("db_create_edit")
self.gridLayout.addWidget(self.db_create_edit, 0, 0, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(dataBaseForm)
self.groupBox_2.setGeometry(QtCore.QRect(870, 270, 231, 171))
self.groupBox_2.setObjectName("groupBox_2")
self.layoutWidget1 = QtWidgets.QWidget(self.groupBox_2)
self.layoutWidget1.setGeometry(QtCore.QRect(10, 20, 211, 141))
self.layoutWidget1.setObjectName("layoutWidget1")
self.gridLayout_2 = QtWidgets.QGridLayout(self.layoutWidget1)
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
self.gridLayout_2.setObjectName("gridLayout_2")
self.A_title_3 = QtWidgets.QLabel(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(11)
self.A_title_3.setFont(font)
self.A_title_3.setObjectName("A_title_3")
self.gridLayout_2.addWidget(self.A_title_3, 3, 0, 1, 1)
self.date_select = QtWidgets.QPushButton(self.layoutWidget1)
self.date_select.setObjectName("date_select")
self.gridLayout_2.addWidget(self.date_select, 5, 0, 1, 1)
self.A_title_2 = QtWidgets.QLabel(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(11)
self.A_title_2.setFont(font)
self.A_title_2.setObjectName("A_title_2")
self.gridLayout_2.addWidget(self.A_title_2, 0, 0, 1, 1)
self.date_start = QtWidgets.QDateTimeEdit(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.date_start.setFont(font)
self.date_start.setDateTime(QtCore.QDateTime(QtCore.QDate(2019, 1, 1), QtCore.QTime(3, 2, 3)))
self.date_start.setCalendarPopup(True)
self.date_start.setObjectName("date_start")
self.gridLayout_2.addWidget(self.date_start, 1, 0, 1, 1)
self.date_end = QtWidgets.QDateTimeEdit(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.date_end.setFont(font)
self.date_end.setDateTime(QtCore.QDateTime(QtCore.QDate(2019, 3, 1), QtCore.QTime(2, 7, 11)))
self.date_end.setCalendarPopup(True)
self.date_end.setObjectName("date_end")
self.gridLayout_2.addWidget(self.date_end, 4, 0, 1, 1)
self.groupBox_3 = QtWidgets.QGroupBox(dataBaseForm)
self.groupBox_3.setGeometry(QtCore.QRect(870, 450, 231, 171))
self.groupBox_3.setObjectName("groupBox_3")
self.layoutWidget2 = QtWidgets.QWidget(self.groupBox_3)
self.layoutWidget2.setGeometry(QtCore.QRect(10, 20, 211, 111))
self.layoutWidget2.setObjectName("layoutWidget2")
self.gridLayout_3 = QtWidgets.QGridLayout(self.layoutWidget2)
self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
self.gridLayout_3.setObjectName("gridLayout_3")
self.db_print = QtWidgets.QPushButton(self.layoutWidget2)
self.db_print.setObjectName("db_print")
self.gridLayout_3.addWidget(self.db_print, 1, 0, 1, 1)
self.db_export = QtWidgets.QPushButton(self.layoutWidget2)
self.db_export.setObjectName("db_export")
self.gridLayout_3.addWidget(self.db_export, 0, 0, 1, 1)
self.layoutWidget3 = QtWidgets.QWidget(dataBaseForm)
self.layoutWidget3.setGeometry(QtCore.QRect(10, 630, 851, 33))
self.layoutWidget3.setObjectName("layoutWidget3")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget3)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.A_title = QtWidgets.QLabel(self.layoutWidget3)
font = QtGui.QFont()
font.setPointSize(10)
self.A_title.setFont(font)
self.A_title.setObjectName("A_title")
self.horizontalLayout_2.addWidget(self.A_title)
self.db_writ = QtWidgets.QLineEdit(self.layoutWidget3)
font = QtGui.QFont()
font.setFamily("新宋体")
font.setPointSize(10)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.db_writ.setFont(font)
self.db_writ.setLayoutDirection(QtCore.Qt.LeftToRight)
self.db_writ.setStyleSheet("")
self.db_writ.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.db_writ.setObjectName("db_writ")
self.horizontalLayout_2.addWidget(self.db_writ)
self.db_insert = QtWidgets.QPushButton(self.layoutWidget3)
self.db_insert.setObjectName("db_insert")
self.horizontalLayout_2.addWidget(self.db_insert)
self.db_delete_row = QtWidgets.QPushButton(self.layoutWidget3)
self.db_delete_row.setObjectName("db_delete_row")
self.horizontalLayout_2.addWidget(self.db_delete_row)
self.dataView = QtWidgets.QTableWidget(dataBaseForm)
self.dataView.setGeometry(QtCore.QRect(10, 80, 851, 541))
self.dataView.setObjectName("dataView")
#self.dataView.setColumnCount(0)
#self.dataView.setRowCount(0) self.retranslateUi(dataBaseForm)
QtCore.QMetaObject.connectSlotsByName(dataBaseForm) def retranslateUi(self, dataBaseForm):
_translate = QtCore.QCoreApplication.translate
dataBaseForm.setWindowTitle(_translate("dataBaseForm", "TableView数据库视图-liangfu"))
self.groupBox.setTitle(_translate("dataBaseForm", "基本操作"))
self.db_create.setText(_translate("dataBaseForm", "创建表格"))
self.db_delete_edit.setText(_translate("dataBaseForm", "dataBase"))
self.db_delete.setText(_translate("dataBaseForm", "删除表格"))
self.db_create_edit.setText(_translate("dataBaseForm", "dataBase"))
self.groupBox_2.setTitle(_translate("dataBaseForm", "查找数据"))
self.A_title_3.setText(_translate("dataBaseForm", "结束时间:"))
self.date_select.setText(_translate("dataBaseForm", "查询"))
self.A_title_2.setText(_translate("dataBaseForm", "开始时间:"))
self.date_start.setDisplayFormat(_translate("dataBaseForm", "yyyy-MM-dd hh:mm:ss"))
self.date_end.setDisplayFormat(_translate("dataBaseForm", "yyyy-MM-dd hh:mm:ss"))
self.groupBox_3.setTitle(_translate("dataBaseForm", "导出保存"))
self.db_print.setText(_translate("dataBaseForm", "打印"))
self.db_export.setText(_translate("dataBaseForm", "导出为Excel文档"))
self.A_title.setText(_translate("dataBaseForm", "输入数值(空格隔开):"))
self.db_writ.setText(_translate("dataBaseForm", "0.1023 0.1233 0.1214"))
self.db_insert.setText(_translate("dataBaseForm", "插入一行"))
self.db_delete_row.setText(_translate("dataBaseForm", "删除一行"))
PyQt5-TableWidget 表格视图的更多相关文章
- UITableView表格视图、UITableView代理方法及应用
一.基本知识点 UITableView表格视图,是一个可以滚动的界面(理解为垂直滚动的UIScrollView),可展示多行数据,没有行数的限制,只能有一列. 使用UITableView: 1.展示信 ...
- Android应用开发学习之表格视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来学习一个使用表格视图的程序,下图是该程序的运行效果: 该程序主Activity文件内容如下: packag ...
- js获取表格视图所选行号的ids
实例化数组 遍历所选行push到数组中 将数组join转换为以,分割的字符串 /*获取指定id的datagrid的表格视图的选择的ids*/ function getDataGridSelectRow ...
- iOS:UITableView表格视图控件
UITableView:表格视图控件,继承滚动视图控件UIScrollView,(类似于UIPickerView选择器,它主要通过设置数据源代理和行为代理实现协议来设置单元格) 对表格的操作主要 ...
- iOS:分组的表格视图UITableView,可以折叠和展开
虽然表格视图可以分组,但是如果分组后,每一行的内容太多,往后翻看起来比较的麻烦.为了解决这个麻烦,可以将分组的行折叠和展开.折叠时,行内容就会隐藏起来:展开时,行内容就会显示出来. 折叠时: 展开后: ...
- iOS:带主标题、副标题、图像类型的表格视图UITableView
制作一个通讯录,包括姓名.电话.头像,将表格视图类型设置为UITableViewCellStyleSubtitle 效果图: //创建一个联系人的类,初始化数据 在视图控制器中实现表格内容的显示 #i ...
- C/C++ Qt TableWidget 表格组件应用
TableWidget 表格结构组件,该组件可以看作是TreeWidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操 ...
- Swift - 使用storyboard创建表格视图(TableViewController)
项目创建完毕后,默认是使用ViewController作为主界面视图.下面通过样例演示,如何使用TableViewController作为主界面视图,同时演示如何在storyboard中设置表格及内部 ...
- QTableView表格视图的列宽设置
Qt中的表格控件可以通过从QTableView或QTableWidget派生子类实现.其中,QTableWidget只是对QTableView的一种简单封装.因为使用QTableView常常需要用户指 ...
随机推荐
- 【Gradle】自定义Android Gradle工程
自定义Android Gradle工程 defaultConfig默认配置 defaultConfig是Android对象中的一个配置项,负责定义所有的默认配置.一个基本的defaultConfig配 ...
- 设置API:wx.openSetting,wx.getSetting使用说明(示例:地图授权与取消授权后的重新授权)
这个API解决了过去一个长久以来无法解决的问题,如何让用户重复授权: 打开小程序的设置界面:就是主动调取授权 目前资料极少,但是已经可以让大家先看看了: 官方文档地址:https://mp.weixi ...
- Linux:DHCP服务器的搭建
了解DHCP协议工作原理 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)提供了动态配置IP地址的功能.在DHCP网络中,客户端不再需要自行输入网络 ...
- 不相交集ADT 你是和谁是一类人?
//不相交集ADT (抽象数据类型) //一般用于集合运算 //用树,这种结构组成,有多个树(=森林) //属于同一颗数的元素,表示处于同一个集合中 //主要支持2个操作. //1. Find操作,找 ...
- new和delete创建和释放动态数组
1.动态创建和释放一维数组 #include<iostream> using namespace std; int main() { int n; cin>>n; //分配动态 ...
- Mysql 如何创建一张临时表
mysql 利用 temporary 关键字就可以创建出一个临时表.创建的这张表会在与服务器的会话终止时自动消失 语法:create temporary table tbl_name...; 规则:每 ...
- LG5196 「USACO2019JAN」Cow Poetry 背包+乘法原理
\(\mathrm{Cow Poetry}\) 问题描述 LG5196 题解 因为每句诗的长度一定是\(k\),所以自然而然想到背包. 设\(opt[i][j]\)代表到第\(i\)位时,结尾为\(j ...
- 推荐几个公众号Markdown格式化网站
好多人都喜欢用 Markdown 写文 但是公众号后台编辑又不支持 Markdown 因此,催生出了一系列 Markdown 渲染格式化的工具网站 我使用了其中的一些 分享给你 1.Md2All 官方 ...
- linux--新装机图形化界面遇到的问题
1 许可证信息 q 退出 c 继续 r 刷新 按以下顺序正确输入即可: 1 ------ 2 ----- q ----- yes
- Unity 利用Cinemachine快速创建灵活的相机系统
在第一或第三人称ACT和FPS游戏中,相机的运动需求是多种多样的,Unity内置的Cinemachine包可以助你快速实现不同相机功能,例如范围追踪,边界设置等. 例如,考虑这样一个功能,这在很多游戏 ...