脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python+PyQt5实现数据库表格动态增删改

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

2022-10-18 11:08Andy-wen Python

这篇文章主要为大家介绍如何利用Python中的PyQt5模块实现对数据库表格的动态增删改,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

题目描述

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

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

拓展;

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

 

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

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

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

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

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

 

实验代码

数据库连接

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实现数据库表格动态增删改

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

清空数据:

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

搜索数据:

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

修改数据:

双击修改

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

右键菜单修改:

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

删除后:

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

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

保存数据:

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

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

原文地址:https://blog.csdn.net/weixin_45816954/article/details/123172747

延伸 · 阅读

精彩推荐
  • Pythonpython爬虫_实现校园网自动重连脚本的教程

    python爬虫_实现校园网自动重连脚本的教程

    下面小编就为大家分享一篇python爬虫_实现校园网自动重连脚本的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    ppingfann7332021-02-04
  • PythonPython代码实现KNN算法

    Python代码实现KNN算法

    这篇文章主要为大家详细介绍了Python代码实现KNN算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Troublemaker2014073642020-12-27
  • Pythonpython判断完全平方数的方法

    python判断完全平方数的方法

    今天小编就为大家分享一篇python判断完全平方数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Guo_Apple18952021-04-19
  • PythonPython求出0~100以内的所有素数

    Python求出0~100以内的所有素数

    质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。下面小编给大家带来了Python求出0~100以内的所...

    陈昱熹11092021-01-07
  • PythonPython中请不要再用re.compile了

    Python中请不要再用re.compile了

    这篇文章主要给大家介绍了关于Python中为何不要再用re.compile的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习...

    青南11542021-07-27
  • PythonPython3.8官网文档之类的基础语法阅读

    Python3.8官网文档之类的基础语法阅读

    类提供了一种组合数据和功能的方法,今天通过本文给大家分享Python3.8官网文档之类的基础语法阅读知识,感兴趣的朋友跟随小编一起看看吧...

    dabiao_z3642021-12-30
  • Python解决出现Incorrect integer value: '' for column 'id' at row 1的问题

    解决出现Incorrect integer value: '' for column 'id' at row 1的问题

    这篇文章主要介绍了解决出现Incorrect integer value: '' for column 'id' at row 1的问题的相关资料,希望通过本文能帮助到大家,让大家遇到这样的问题及时的解决,...

    点点寒彬16742020-12-14
  • Pythonpython调用stitcher类自动实现多个图像拼接融合功能

    python调用stitcher类自动实现多个图像拼接融合功能

    这篇文章主要介绍了python调用stitcher类自动实现多个图像拼接融合功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的...

    Helloworld-睖10512021-10-18