Python+PyQt5实现数据库表格动态增删改

目录
  • 题目描述
  • 解题思路/算法分析/问题及解决
  • 实验代码
  • 运行结果

题目描述

本次实验为连接数据库的实验,并对数据库进行一些简单的操作,要实现的基本功能如下所示,要能连接并展现数据库里的数据,能够实现插入功能。

拓展;

  • 实现按学号查找学生信息功能
  • 实现清空数据功能
  • 实现保存数据功能
  • 实现右键菜单功能

解题思路/算法分析/问题及解决

本次实验可主要分为两个部分,即数据库连接操作部分和数据可视化操作界面部分。

数据库连接部分采用python的pymysql库对数据库进行连接操作。

数据可视化部分采用tableWidget控件进行表格化的呈现,并通过相应的控件交互来实现功能。TableWidget的主要方法如下表所示:

实验代码

数据库连接

def db_connect(self):
        self.db = pymysql.connect(host='localhost',
                             user='root',
                             password='Zwq197166',
                             port=3306,
                             database='test')

可视化界面操作部分

def inser_row(self, row, sid, name, sex, address):
        sid_item = QTableWidgetItem(sid)
        name_item = QTableWidgetItem(name)
        sex_item = QTableWidgetItem(sex)
        address_item = QTableWidgetItem(address)
        self.tableWidget.insertRow(row)
        self.tableWidget.setItem(row, 0, sid_item)
        self.tableWidget.setItem(row, 1, name_item)
        self.tableWidget.setItem(row, 2, sex_item)
        self.tableWidget.setItem(row, 3, address_item)

    @pyqtSlot()
    def on_button_load_clicked(self):
        if self.button_save.isEnabled():
            r = QMessageBox.warning(self, "警告", "是否覆盖当前表格数据", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
            if r == QMessageBox.No:
                return
        self.tableWidget.setRowCount(0)
        self.tableWidget.clearContents()
        self.db_connect()
        cursor = self.db.cursor()
        sql = "select * from my_student;"
        try:
            cursor.execute(sql)
            results = cursor.fetchall()
            for (sid, name, sex,address) in results:
                print(sid, name, sex, address)
                row = self.tableWidget.rowCount()
                # print(row)
                self.inser_row(row, sid, name, sex, address)
                data[sid] = [name, sex, address]
        except:
            print("unable to fetch data")

        self.db.close()
        self.button_save.setEnabled(True)
        print("load")

    @pyqtSlot()
    def on_button_add_clicked(self):
        di = inputDialog()
        ok = di.exec_()
        if not ok:
            return
        name = di.line_name.text()
        sid = di.line_id.text()
        sex = di.line_sex.text()
        address = di.line_address.text()
        print(name,sid)
        print(type(address))
        data[sid] = [name, sex, address]
        self.inser_row(self.tableWidget.rowCount(), sid, name, sex, address)
        print(data)
        print("add")
        # self.tableWidget.insertRow(self.tableWidget.rowCount()-1)
        self.button_save.setEnabled(True)

    @pyqtSlot()
    def on_button_save_clicked(self):
        print(data)
        self.db_connect()
        cursor = self.db.cursor()
        try:
            sql = "delete from my_student;"
            cursor.execute(sql)
            # self.db.commit()
            for key, value in data.items():
                sql = "insert into my_student(sid,name,sex,address) values('{sid}','{name}','{sex}','{address}');".format(sid=key, name=value[0], sex=value[1], address=value[2])
                print(sql)
                cursor.execute(sql)
            self.db.commit()
            self.db.close()
            print("save")
            self.button_save.setEnabled(False)
        except:
            QMessageBox.critical(self, "错误", "数据格式有误,请检查")

    @pyqtSlot()
    def on_button_clear_clicked(self):
        self.tableWidget.setRowCount(0)
        self.tableWidget.clearContents()
        data.clear()
        self.line_id.clear()
        self.button_save.setEnabled(True)

    @pyqtSlot()
    def on_button_search_clicked(self):
        sid = self.line_id.text()
        if not sid:
            QMessageBox.critical(self, "警告", "请输入一个学号!")
            return
        print(sid)
        if sid in data:
            search = INFO(sid)
            search.exec_()
            # print("search")
        else:
            QMessageBox.critical(self, "错误", "该学号不存在!")

    @pyqtSlot(QTableWidgetItem)
    def on_tableWidget_itemActivated(self, item):
        """
        按住Enter键时,当前选中的单元格向下
        """
        row = self.tableWidget.row(item)
        column = self.tableWidget.column(item)
        totalrow = self.tableWidget.rowCount()

        if row + 1 < totalrow:
            row = self.tableWidget.row(item) + 1
            self.tableWidget.setCurrentCell(row, column)
        elif row + 2 == totalrow:
            row = totalrow - 1
            self.tableWidget.setCurrentCell(row, column)

    @pyqtSlot(int, int)
    def on_tableWidget_cellDoubleClicked(self, row, column):
        id = self.tableWidget.item(row, 0).text()
        di = inputDialog(sid=id)
        ok = di.exec_()
        if not ok:
            return
        name = di.line_name.text()
        sid = di.line_id.text()
        sex = di.line_sex.text()
        address = di.line_address.text()
        print("before:", id)
        print("after:", sid)
        self.tableWidget.item(row, 0).setText(sid)
        self.tableWidget.item(row, 1).setText(name)
        self.tableWidget.item(row, 2).setText(sex)
        self.tableWidget.item(row, 3).setText(address)
        data[sid] = [name, sex, address]
        if id != sid:
            del data[id]
        self.button_save.setEnabled(True)

    def closeEvent(self, event):
        if self.button_save.isEnabled():
            r = QMessageBox.warning(self, "警告", "你还有操作没保存,现在保存下?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
            if r == QMessageBox.No:
                event.accept()
            else:
                event.ignore()

    def context_menu(self,pos):
        pop_menu = QMenu()
        change_new_event = pop_menu.addAction("修改行")
        delete_event = pop_menu.addAction("删除行")
        action = pop_menu.exec_(self.tableWidget.mapToGlobal(pos))

        if action == change_new_event:
            item = self.tableWidget.selectedItems()
            row = item[0].row()
            id = self.tableWidget.item(row, 0).text()
            di = inputDialog(sid=id)
            ok = di.exec_()
            if not ok:
                return
            name = di.line_name.text()
            sid = di.line_id.text()
            sex = di.line_sex.text()
            address = di.line_address.text()
            print("before:",id)
            print("after:",sid)
            self.tableWidget.item(row, 0).setText(sid)
            self.tableWidget.item(row, 1).setText(name)
            self.tableWidget.item(row, 2).setText(sex)
            self.tableWidget.item(row, 3).setText(address)
            data[sid] = [name, sex, address]
            if id != sid:
                del data[id]
            self.button_save.setEnabled(True)
        elif action == delete_event:
            r = QMessageBox.warning(self, "注意", "删除可不能恢复了哦!", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if r == QMessageBox.No:
                return
            items = self.tableWidget.selectedItems()
            if items:
                selected_rows = []
                for i in items:
                    row = i.row()
                    if row not in selected_rows:
                        selected_rows.append(row)
                selected_rows = sorted(selected_rows, reverse=True)
                for r in selected_rows:
                    sid = self.tableWidget.item(r, 0).text()
                    del data[sid]
                    self.tableWidget.removeRow(r)
            self.button_save.setEnabled(True)

class inputDialog(QDialog, Ui_Dialog_input):
    def __init__(self, sid=None):
        super(inputDialog, self).__init__()
        self.setupUi(self)
        self.sid = sid
        self.buttonBox.accepted.connect(self.check)

        if sid:
            self.line_id.setText(sid)
            self.line_name.setText(data[sid][0])
            self.line_sex.setText(data[sid][1])
            self.line_address.setText(data[sid][2])

    def check(self):
        sid = self.line_id.text()
        name = self.line_name.text()
        if sid in data and self.sid not in data:
            r = QMessageBox.warning(self, "警告", "该学号已存在!", QMessageBox.Ok)
            return

        if not sid:
            r = QMessageBox.warning(self, "警告", "学号为必填项!", QMessageBox.Ok)
            return

        if not name:
            r = QMessageBox.warning(self, "警告", "姓名为必填项!", QMessageBox.Ok)
            return

        self.accept()
        # print('miss')

class INFO(QDialog, Ui_Dialog_info):
    def __init__(self, id: str):
        super(INFO, self).__init__()
        self.setupUi(self)
        self.line_id.setText(id)
        self.line_name.setText(data[id][0])
        self.line_sex.setText(data[id][1])
        self.line_address.setText(data[id][2])

    @pyqtSlot()
    def on_button_confirm_clicked(self):
        # print(1)
        self.close()

运行结果

导入数据:

添加数据:

清空数据:

搜索数据:

修改数据:

双击修改

右键菜单修改:

删除后:

保存数据:

以上就是Python+PyQt5实现数据库表格动态增删改的详细内容,更多关于Python PyQt5数据库表格的资料请关注我们其它相关文章!

(0)

相关推荐

  • python3+PyQt5使用数据库表视图

    上文提到窗体可以一次性呈现出来自同一记录的各个域,但是对于用户希望能看到多条记录的表来说,就需要使用表格化的视图了.本文通过python3+pyqt5改写实现了python Qt gui 快速变成15章的例子,用户能够一次看到多条记录. #!/usr/bin/env python3 import os import sys from PyQt5.QtCore import (PYQT_VERSION_STR, QDate, QFile, QRegExp, QVariant, QModelInde

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

    目录 (一).手动连接数据库 (二).编程中使用数据库 (一).手动连接数据库 与下一个的程序连接数据库是独立的2个部分 (1)连接数据库 (2)设置数据源类型 (3)连接及测试 (4)属性中的连接字符串 (二).编程中使用数据库 (5)在Form上加入datagridview,加入两个按钮 (6)代码中加上数据库相关命名空间 using System.Data.SqlClient; (7)第一个按钮“连接数据库”中的代码 效果图: from PyQt5.QtWidgets import * f

  • Python GUI教程之在PyQt5中使用数据库的方法

    目录 PyQt5的SQL数据库支持 在PyQt5中简单使用数据库 创建一个UI界面 连接一个数据库 在UI界面查看和修改数据 添加和删除数据 在桌面图像化界面编程中,我们通常需要将一些数据或配置信息存储在本地.在本地进行数据的存储,我们可以直接使用文本文件,比如ini文件.csv文件.json文件等,或者是使用文件型的数据库(比如sqlit3)进行存储. PyQt5的SQL数据库支持 Qt平台对SQL编程有着良好的支持,PyQt5也一并继承了过来.在PyQt5中,QtSql子模块提供对SQL数据

  • python3+PyQt5 数据库编程--增删改实例

    本文通过python3+pyqt5改写实现了python Qt gui 编程变成15章的excise例子. #!/usr/bin/env python3 import os import sys from PyQt5.QtCore import (QFile, QVariant, Qt) from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QMenu, QMessageBox, QTableView, QVB

  • python3+PyQt5使用数据库窗口视图

    能够为数据库数据提供的最简单的用户界面之一就是窗体,窗体可以一次性呈现出来自同一记录的各个域.本文通过python3+pyqt5改写实现了python Qt gui 快速变成15章的例子. #!/usr/bin/env python3 import os import sys from PyQt5.QtCore import (QDate, QDateTime, QFile, QVariant, Qt) from PyQt5.QtWidgets import (QApplication, QDa

  • Python+PyQt5实现数据库表格动态增删改

    目录 题目描述 解题思路/算法分析/问题及解决 实验代码 运行结果 题目描述 本次实验为连接数据库的实验,并对数据库进行一些简单的操作,要实现的基本功能如下所示,要能连接并展现数据库里的数据,能够实现插入功能. 拓展; 实现按学号查找学生信息功能 实现清空数据功能 实现保存数据功能 实现右键菜单功能 解题思路/算法分析/问题及解决 本次实验可主要分为两个部分,即数据库连接操作部分和数据可视化操作界面部分. 数据库连接部分采用python的pymysql库对数据库进行连接操作. 数据可视化部分采用

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

    目录 (一).手动连接数据库 (二).编程中使用数据库 (一).手动连接数据库 与下一个的程序连接数据库是独立的2个部分 (4)属性中的连接字符串 (二).编程中使用数据库 效果图: from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5 import QtCore from copy import copy import sys import pymysql in

  • Python连接mysql数据库及简单增删改查操作示例代码

    1.安装pymysql 进入cmd,输入 pip install pymysql: 2.数据库建表 在数据库中,建立一个简单的表,如图: 3.简单操作 3.1查询操作 #coding=utf-8 #连接数据库测试 import pymysql #打开数据库 db = pymysql.connect(host="localhost",user="root",password="root",db="test") #使用cursor

  • python连接mysql数据库示例(做增删改操作)

    一.相关代码数据库配置类 MysqlDBConn.py 复制代码 代码如下: #encoding=utf-8'''Created on 2012-11-12 Mysql Conn连接类''' import MySQLdb class DBConn: conn = None #建立和数据库系统的连接    def connect(self):        self.conn = MySQLdb.connect(host="localhost",port=3306,user="

  • 利用python模拟sql语句对员工表格进行增删改查

    本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 具体需求: 员工信息表程序,实现增删改查操作: 可进行模糊查询,语法支持下面3种: select name,age from staff_data where age > 22                  多个查询参数name,age 用','分割 select * from staff_data where dept = 人事 select * from

  • Python通过pymysql调用MySQL进行增删改移查

    目录 一.关系数据库 1.数据模型 2.面相对象模型 二.了解关系数据库的概念和特点 基本概念 基本特点 三.常用字段数据类型 四.使Mysql和Pymysql链接成功 五. All源码(注明) 六.博客总结 一.关系数据库 1.数据模型 实体间的关系分为以下有三种: 1*)一对一模型 一对一(one-to-one) 关系模型用二维表格表示数据及数据联系,是应用最为广泛的数据模型.目前,各种常用的数据库,如Microsoft SQL Server.Microsoft Access.Microso

  • ThinkPHP5.1框架数据库链接和增删改查操作示例

    本文实例讲述了ThinkPHP5.1框架数据库链接和增删改查操作.分享给大家供大家参考,具体如下: 一.数据库的链接方式 <?php namespace app\index\controller; use think\Db; class Demo { //1.全局配置 config/database.php配置 public function dbTest() { return Db::table('pzq_article') ->where('id','29') ->value('ti

  • Python使用pymysql模块操作mysql增删改查实例分析

    本文实例讲述了Python使用pymysql模块操作mysql增删改查.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- import pymysql user = input('请输入用户名:') pwd = input('请输入密码:') # 1.连接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', db='t1', charset='utf8')

  • Mybatis实现动态增删改查功能的示例代码

    一.Mybatis 流程简介 最近在看 Mybatis 的源码,大致了解整个框架流程后便手写了一个特别简单的SimpMybatis的小Demo,来巩固这整个框架的学习.下图是我所画的框架大致执行流程:

随机推荐