开发者

PyQt5 python 数据库 表格动态增删改详情

目录
  • (一)、手动连接数据库
  • (二)、编程中使用数据库

 

(一)、手动连接数据库

与下一个的程序连接数据库是独立的2个部分

(1)连接数据库

PyQt5 python 数据库 表格动态增删改详情

(2)设置数据源类型

PyQt5 python 数据库 表格动态增删改详情

(3)连接及测试

PyQt5 python 数据库 表格动态增删改详情

(4)属性中的连接字符串

PyQt5 python 数据库 表格动态增删改详情

(二)、编程中使用数据库

(5)在Form上加入datagridview,加入两个按钮

PyQt5 python 数据库 表格动态增删改详情

(6)代码中加上数据库相关命名空间

using System.Data.SqlClient;

(7)第一个按钮“连接数据库”中的代码

PyQt5 python 数据库 表格动态增删改详情

效果图:

PyQt5 python 数据库 表格动态增删改详情

PyQt5 python 数据库 表格动态增删改详情

PyQt5 python 数据库 表格动态增删改详情

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: 返回操作数据库的cursor
  """
  conn = pymysql.connect(host='127.0.0.1' # 连接名称,默认127.0.0.1
             , user='root' # 用户名
             , passwd='' # 密码
        http://www.cppcns.com     , port=3306 # 端口,默认为3306
             , db='mysql' # 数据库名称
             , charset='utf8' # 字符编码
             )
  return conn

def ExecuSQL(argv):
  """
  执行数据库的语句,但是没有返回值
  :param argv:
  """
  conn=getCursor()
  cur = conn.cursor() # 生成游标对象
  cur.execute(argv) # 执行SQL语句
  conn.commit()
  cur.close() # 关闭游标
  conn.close() # 关闭连接

def getData(argv):
  """
  执行数据库的语句,有返回值
  :param argv:
  """
  conn = getCursor()
  cur = conn.cursor() # 生成游标对象
  cur.execute(argv) # 执行SQL语句
  data = cur.fetchall() # 通过fetchall方法获得数据
  cur.close() # 关闭游标
  conn.close() # 关闭连接
  return data

class Example(QWidget):
  def __init__(self, parent=None):
    super(Example, self).__init__(parent)
    hhbox = QHBoxLayout() # 横向布局
    hhbowww.cppcns.comx_1=QHBoxLayout()
    vbox=QVBoxLayout()


    self.displayList = []
    self.saveList = []
    self.table = QTableWidget()

    self.addItem=QPushButton("添加数据")
    self.searchItem=QPushButton("刷新数据")
    self.deleteItem = QPushButton("删除数据")
    self.saveItem=QPushButton("保存数据")

    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) # 创建布局
    self.setWindowTitle("数据库—表格")
    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):
    """
    一旦检测到数据改变,则进行检查,
    选择添加新数据还是对原数据进行修改
    :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):
    """
    添加空白行按钮的触发事件
    添加后刷新视图
    """
    num = self.table.rowCount()-1
    self.newLine(num)
    self.update()

  def init(self):
    """
    初始化操作
    即从数据库加载数据
    """
    argvhttp://www.cppcns.com="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即刷新数据,
    用保存的数据覆盖未保存的数据
    """
    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):
    """
    若有选中行,点击删除后即可删除
    :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("删除一条数据")
      self.displayList.pop(id-1)
    self.header.pop()
    self.table.removeRow(row_select[0].row())
    self.update()

  def _saveItem(self):
    """
    点击保存需要
    筛选出需要更新的数据
    需要删除的数据
    需要添加的数据
    """
    idList=[int(k[0]) for k in self.saveList]
    _idList=[int(k[0]) for k in self.displayList]
    print("点击保存")
    # print(self.saveList)
    # print(self.displayList)
    for item in self.displayList:
      if item not in self.saveList:
        print("存在修改数据")
        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)
          Exe编程客栈cuSQL(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: 在对应序号处的序号画空白行
    :param item: 输入为对应数据
    """
    # 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.setItwww.cppcns.comem(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: 初始化表头和行列数
    """
    self.header = [""]
    self.table.setColumnCount(5)
    self.table.setRowCount(2) # 设置表格有两行五列
    self.table.setItem(0, 0, QTableWidgetItem("      学号"))
    self.table.setItem(0, 1, QTableWidgetItem("名字"))
    self.table.setItem(0, 2, QTableWidgetItem("出生日期"))
    self.table.setItem(0, 3, QTableWidgetItem("性别"))
    self.table.setItem(0, 4, QTableWidgetItem("电话号码"))
    if flag:
      self.init()

if __name__ == "__main__":
  app = QApplication(sys.argv)
  dlg = Example()
  sys.exit(app.exec_())
++

到此这篇关于PyQt5 python 数据库 表格动态增删改详情的文章就介绍到这了,更多相关PyQt5 python 数据库 表格动态增删改内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜