PyQt5?python?數(shù)據(jù)庫(kù)?表格動(dòng)態(tài)增刪改詳情
(一)、手動(dòng)連接數(shù)據(jù)庫(kù)
與下一個(gè)的程序連接數(shù)據(jù)庫(kù)是獨(dú)立的2個(gè)部分

(4)屬性中的連接字符串

(二)、編程中使用數(shù)據(jù)庫(kù)

效果圖:


from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5 import QtCore
from copy import copy
import sys
import pymysql
ins="insert into student (Sno,Sname,Sage,Ssex,Stele) values ('{}','{}','{}','{}','{}');"
delete="delete from student where Sno={}"
sel="select * from student"
upd="update student set Sname='{}',Sage='{}',Ssex='{}',Stele='{}' where Sno={};"
def getCursor():
? ? """
? ? :return: 返回操作數(shù)據(jù)庫(kù)的cursor
? ? """
? ? conn = pymysql.connect(host='127.0.0.1' ?# 連接名稱(chēng),默認(rèn)127.0.0.1
? ? ? ? ? ? ? ? ? ? ? ? ? ?, user='root' ?# 用戶(hù)名
? ? ? ? ? ? ? ? ? ? ? ? ? ?, passwd='' ?# 密碼
? ? ? ? ? ? ? ? ? ? ? ? ? ?, port=3306 ?# 端口,默認(rèn)為3306
? ? ? ? ? ? ? ? ? ? ? ? ? ?, db='mysql' ?# 數(shù)據(jù)庫(kù)名稱(chēng)
? ? ? ? ? ? ? ? ? ? ? ? ? ?, charset='utf8' ?# 字符編碼
? ? ? ? ? ? ? ? ? ? ? ? ? ?)
? ? return conn
def ExecuSQL(argv):
? ? """
? ? 執(zhí)行數(shù)據(jù)庫(kù)的語(yǔ)句,但是沒(méi)有返回值
? ? :param argv:
? ? """
? ? conn=getCursor()
? ? cur = conn.cursor() ?# 生成游標(biāo)對(duì)象
? ? cur.execute(argv) ?# 執(zhí)行SQL語(yǔ)句
? ? conn.commit()
? ? cur.close() ?# 關(guān)閉游標(biāo)
? ? conn.close() ?# 關(guān)閉連接
def getData(argv):
? ? """
? ? 執(zhí)行數(shù)據(jù)庫(kù)的語(yǔ)句,有返回值
? ? :param argv:
? ? """
? ? conn = getCursor()
? ? cur = conn.cursor() ?# 生成游標(biāo)對(duì)象
? ? cur.execute(argv) ?# 執(zhí)行SQL語(yǔ)句
? ? data = cur.fetchall() ?# 通過(guò)fetchall方法獲得數(shù)據(jù)
? ? cur.close() ?# 關(guān)閉游標(biāo)
? ? conn.close() ?# 關(guān)閉連接
? ? return data
class Example(QWidget):
? ? def __init__(self, parent=None):
? ? ? ? super(Example, self).__init__(parent)
? ? ? ? hhbox = QHBoxLayout() ?# 橫向布局
? ? ? ? hhbox_1=QHBoxLayout()
? ? ? ? vbox=QVBoxLayout()
? ? ? ? self.displayList = []
? ? ? ? self.saveList = []
? ? ? ? self.table = QTableWidget()
? ? ? ? self.addItem=QPushButton("添加數(shù)據(jù)")
? ? ? ? self.searchItem=QPushButton("刷新數(shù)據(jù)")
? ? ? ? self.deleteItem = QPushButton("刪除數(shù)據(jù)")
? ? ? ? self.saveItem=QPushButton("保存數(shù)據(jù)")
? ? ? ? self.table_sitting()
? ? ? ? hhbox.addWidget(self.table) ?# 把表格加入布局
? ? ? ? hhbox_1.addWidget(self.addItem)
? ? ? ? hhbox_1.addWidget(self.searchItem)
? ? ? ? hhbox_1.addWidget(self.deleteItem)
? ? ? ? hhbox_1.addWidget(self.saveItem)
? ? ? ? vbox.addLayout(hhbox)
? ? ? ? vbox.addLayout(hhbox_1)
? ? ? ? self.setLayout(vbox) ?# 創(chuàng)建布局
? ? ? ? self.setWindowTitle("數(shù)據(jù)庫(kù)—表格")
? ? ? ? self.setWindowIcon(QIcon("icon.png"))
? ? ? ? self.connecter()
? ? ? ? self.resize(680, 600)
? ? ? ? self.show()
? ? def connecter(self):
? ? ? ? self.addItem.clicked.connect(self._addItem)
? ? ? ? self.deleteItem.clicked.connect(self._deleteItem)
? ? ? ? self.searchItem.clicked.connect(self._redraw)
? ? ? ? self.saveItem.clicked.connect(self._saveItem)
? ? ? ? self.table.itemChanged.connect(self._dataChanged)
? ? def _dataChanged(self):
? ? ? ? """
? ? ? ? 一旦檢測(cè)到數(shù)據(jù)改變,則進(jìn)行檢查,
? ? ? ? 選擇添加新數(shù)據(jù)還是對(duì)原數(shù)據(jù)進(jìn)行修改
? ? ? ? :return:
? ? ? ? """
? ? ? ? row_select = self.table.selectedItems()
? ? ? ? if len(row_select) == 0:
? ? ? ? ? ? return
? ? ? ? row= row_select[0].row()
? ? ? ? content = (self.table.item(row, 0).text(), self.table.item(row, 1).text(),
? ? ? ? ? ? ? ? ? ?self.table.item(row, 2).text(), self.table.item(row, 3).text(),
? ? ? ? ? ? ? ? ? ?self.table.item(row, 4).text())
? ? ? ? if row<=len(self.displayList):
? ? ? ? ? ? print("修改行",content)
? ? ? ? ? ? self.displayList[row-1]=content
? ? ? ? else:
? ? ? ? ? ? print("最新行",content)
? ? ? ? ? ? self.displayList.append(content)
? ? def _addItem(self):
? ? ? ? """
? ? ? ? 添加空白行按鈕的觸發(fā)事件
? ? ? ? 添加后刷新視圖
? ? ? ? """
? ? ? ? num = self.table.rowCount()-1
? ? ? ? self.newLine(num)
? ? ? ? self.update()
? ? def init(self):
? ? ? ? """
? ? ? ? 初始化操作
? ? ? ? 即從數(shù)據(jù)庫(kù)加載數(shù)據(jù)
? ? ? ? """
? ? ? ? argv="select * from student"
? ? ? ? data=getData(argv)
? ? ? ? print("初始化")
? ? ? ? for index,item in enumerate(data):
? ? ? ? ? ? self.newLine(index+1,item=item)
? ? ? ? ? ? self.displayList.append(item)
? ? ? ? self.saveList=copy(self.displayList)
? ? ? ? self.update()
? ? def _redraw(self):
? ? ? ? """
? ? ? ? repaint即刷新數(shù)據(jù),
? ? ? ? 用保存的數(shù)據(jù)覆蓋未保存的數(shù)據(jù)
? ? ? ? """
? ? ? ? self.table.setRowCount(0)
? ? ? ? self.table.clearContents()
? ? ? ? self.table_sitting(flag=0)
? ? ? ? for index,item in enumerate(self.saveList):
? ? ? ? ? ? self.newLine(index+1,item)
? ? ? ? self.update()
? ? def _deleteItem(self):
? ? ? ? """
? ? ? ? 若有選中行,點(diǎn)擊刪除后即可刪除
? ? ? ? :return:
? ? ? ? """
? ? ? ? # ExecuSQL()
? ? ? ? row_select = self.table.selectedItems()
? ? ? ? if len(row_select) == 0:
? ? ? ? ? ? return
? ? ? ? id = row_select[0].row()
? ? ? ? if int(id)<len(self.displayList):
? ? ? ? ? ? print("刪除一條數(shù)據(jù)")
? ? ? ? ? ? self.displayList.pop(id-1)
? ? ? ? self.header.pop()
? ? ? ? self.table.removeRow(row_select[0].row())
? ? ? ? self.update()
? ? def _saveItem(self):
? ? ? ? """
? ? ? ? 點(diǎn)擊保存需要
? ? ? ? 篩選出需要更新的數(shù)據(jù)
? ? ? ? 需要?jiǎng)h除的數(shù)據(jù)
? ? ? ? 需要添加的數(shù)據(jù)
? ? ? ? """
? ? ? ? idList=[int(k[0]) for k in self.saveList]
? ? ? ? _idList=[int(k[0]) for k in self.displayList]
? ? ? ? print("點(diǎn)擊保存")
? ? ? ? # print(self.saveList)
? ? ? ? # print(self.displayList)
? ? ? ? for item in self.displayList:
? ? ? ? ? ? if item not in self.saveList:
? ? ? ? ? ? ? ? print("存在修改數(shù)據(jù)")
? ? ? ? ? ? ? ? if item[0] not in idList:
? ? ? ? ? ? ? ? ? ? sql=ins.format(item[0],item[1], item[2], item[3], item[4])
? ? ? ? ? ? ? ? ? ? print(sql)
? ? ? ? ? ? ? ? ? ? ExecuSQL(sql)
? ? ? ? ? ? ? ? ? ? print("insert")
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? sql = upd.format(item[1], item[2], item[3], item[4],item[0])
? ? ? ? ? ? ? ? ? ? print(sql)
? ? ? ? ? ? ? ? ? ? ExecuSQL(sql)
? ? ? ? ? ? ? ? ? ? print("update")
? ? ? ? for item in self.saveList:
? ? ? ? ? ? if item[0] not in _idList:
? ? ? ? ? ? ? ? sql = delete.format(item[0])
? ? ? ? ? ? ? ? print(sql)
? ? ? ? ? ? ? ? ExecuSQL(sql)
? ? ? ? ? ? ? ? print("delete",item)
? ? ? ? self.saveList=copy(self.displayList)
? ? def newLine(self,num,item=None):
? ? ? ? """
? ? ? ? :param num: 在對(duì)應(yīng)序號(hào)處的序號(hào)畫(huà)空白行
? ? ? ? :param item: 輸入為對(duì)應(yīng)數(shù)據(jù)
? ? ? ? """
? ? ? ? # num=self.table.rowCount()
? ? ? ? self.table.insertRow(num)
? ? ? ? _0= QTableWidgetItem("")
? ? ? ? _0.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
? ? ? ? _1 = QTableWidgetItem("")
? ? ? ? _2 = QTableWidgetItem("")
? ? ? ? _3 = QTableWidgetItem("")
? ? ? ? _4 = QTableWidgetItem("")
? ? ? ? # item=studentInfo()
? ? ? ? if item !=None:
? ? ? ? ? ? _0.setText(str(item[0]))
? ? ? ? ? ? _1.setText(str(item[1]))
? ? ? ? ? ? _2.setText(str(item[2]))
? ? ? ? ? ? _3.setText(str(item[3]))
? ? ? ? ? ? _4.setText(str(item[4]))
? ? ? ? else:
? ? ? ? ? ? _0.setText(str(num))
? ? ? ? self.table.setItem(num, 0, _0)
? ? ? ? self.table.setItem(num, 1, _1)
? ? ? ? self.table.setItem(num, 2, _2)
? ? ? ? self.table.setItem(num, 3, _3)
? ? ? ? self.table.setItem(num, 4, _4)
? ? ? ? self.header.append(str(num))
? ? ? ? self.table.setVerticalHeaderLabels(self.header)
? ? ? ? self.update()
? ? def table_sitting(self,flag=1):
? ? ? ? """
? ? ? ? :param flag: 初始化表頭和行列數(shù)
? ? ? ? """
? ? ? ? self.header = [""]
? ? ? ? self.table.setColumnCount(5)
? ? ? ? self.table.setRowCount(2) ?# 設(shè)置表格有兩行五列
? ? ? ? self.table.setItem(0, 0, QTableWidgetItem(" ? ? ? ? ? 學(xué)號(hào)"))
? ? ? ? self.table.setItem(0, 1, QTableWidgetItem("名字"))
? ? ? ? self.table.setItem(0, 2, QTableWidgetItem("出生日期"))
? ? ? ? self.table.setItem(0, 3, QTableWidgetItem("性別"))
? ? ? ? self.table.setItem(0, 4, QTableWidgetItem("電話(huà)號(hào)碼"))
? ? ? ? if flag:
? ? ? ? ? ? self.init()
if __name__ == "__main__":
? ? app = QApplication(sys.argv)
? ? dlg = Example()
? ? sys.exit(app.exec_())
++到此這篇關(guān)于PyQt5 python 數(shù)據(jù)庫(kù) 表格動(dòng)態(tài)增刪改詳情的文章就介紹到這了,更多相關(guān)PyQt5 python 數(shù)據(jù)庫(kù) 表格動(dòng)態(tài)增刪改內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python+PyQt5實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)備份神器
- 基于PyQt5實(shí)現(xiàn)SqlServer數(shù)據(jù)庫(kù)表導(dǎo)出Excel表格小工具
- Python+PyQt5實(shí)現(xiàn)數(shù)據(jù)庫(kù)表格動(dòng)態(tài)增刪改
- Python GUI教程之在PyQt5中使用數(shù)據(jù)庫(kù)的方法
- pyqt5數(shù)據(jù)庫(kù)使用詳細(xì)教程(打包解決方案)
- python3+PyQt5 數(shù)據(jù)庫(kù)編程--增刪改實(shí)例
- python3+PyQt5使用數(shù)據(jù)庫(kù)表視圖
- python3+PyQt5使用數(shù)據(jù)庫(kù)窗口視圖
- PyQt5與數(shù)據(jù)庫(kù)交互的項(xiàng)目實(shí)踐
相關(guān)文章
深入淺析Python科學(xué)計(jì)算庫(kù)Scipy及安裝步驟
這篇文章主要介紹了Python科學(xué)計(jì)算庫(kù)—Scipy的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
詳解Python圖像處理中內(nèi)存泄漏的問(wèn)題解決方法
在Python編程中,尤其是在圖像處理領(lǐng)域,內(nèi)存泄漏是一個(gè)不容忽視的問(wèn)題,本文將深入探討Python為何容易發(fā)生內(nèi)存泄漏,以及如何有效檢測(cè)和解決,希望對(duì)大家有所幫助2025-02-02
OpenCV-Python實(shí)現(xiàn)輪廓的特征值
輪廓自身的一些屬性特征及輪廓所包圍對(duì)象的特征對(duì)于描述圖像具有重要意義。本篇博文將介紹幾個(gè)輪廓自身的屬性特征及輪廓包圍對(duì)象的特征,感興趣的可以了解一下2021-06-06
Python+OpenCV實(shí)現(xiàn)鼠標(biāo)畫(huà)瞄準(zhǔn)星的方法詳解
所謂瞄準(zhǔn)星指的是一個(gè)圓圈加一個(gè)圓圈內(nèi)的十字線(xiàn),就像玩射擊游戲狙擊槍開(kāi)鏡的樣子一樣。本文將利用Python+OpenCV實(shí)現(xiàn)鼠標(biāo)畫(huà)瞄準(zhǔn)星,感興趣的可以嘗試一下2022-08-08
Python干貨實(shí)戰(zhàn)之逆向登錄世界上最大的游戲平臺(tái)Stream
有些網(wǎng)頁(yè)中的數(shù)據(jù)進(jìn)行了算法加密 這些算法代碼是JavaScript 加密的地方就是在js文件里,我們需要破解這些算法加密 就需要了解這加密的過(guò)程 獲取加密過(guò)程中的代碼 然后進(jìn)行后續(xù)的反反爬蟲(chóng)操作2021-10-10
詳解如何通過(guò)Python實(shí)現(xiàn)批量數(shù)據(jù)提取
每天面對(duì)成堆的發(fā)票,無(wú)論是發(fā)票還是承兌單據(jù),抑或是其他各類(lèi)公司數(shù)據(jù)要從照片、PDF等不同格式的內(nèi)容中提取,我們都有必要進(jìn)行快速辦公的能力提升。本文就教你如何利用Python實(shí)現(xiàn)批量數(shù)據(jù)提取吧2023-03-03
python 簡(jiǎn)單的繪圖工具turtle使用詳解
這篇文章主要介紹了python 簡(jiǎn)單的繪圖工具turtle使用詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
如何在django中實(shí)現(xiàn)分頁(yè)功能
這篇文章主要介紹了如何在django中實(shí)現(xiàn)分頁(yè)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python數(shù)據(jù)處理的六種方式總結(jié)
在 Python 的數(shù)據(jù)處理方面經(jīng)常會(huì)用到一些比較常用的數(shù)據(jù)處理方式,比如pandas、numpy等等。今天介紹的這款 Python 數(shù)據(jù)處理的管道數(shù)據(jù)處理方式,通過(guò)鏈?zhǔn)胶瘮?shù)的方式可以輕松的完成對(duì)list列表數(shù)據(jù)的處理,希望對(duì)大家有所幫助2022-11-11
python select.select模塊通信全過(guò)程解析
這篇文章主要為大家解析了python select.select模塊通信全過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09

