PyQt5创建与MySQL数据库集成的应用程序

news2024/10/7 0:05:16

最近,对之前的mysql管理系统进行了更新升级,制作了一版关于车牌的管理系统!

(1)实现了对车牌和用户基本信息的增删改查的功能 !

(2)加入了对数据库的刷新和状态显示功能

(3)加入了完善的日志系统

(4)有导出功能(需要输入管理员密码)

在本教程中,我们将学习如何创建一个使用PyQt5的应用程序,该应用程序连接到MySQL数据库并执行基本的CRUD(创建、读取、更新、删除)操作。我们将涵盖以下步骤:

  1. 设置PyQt5应用程序
  2. 连接到MySQL数据库
  3. 在表格中显示数据
  4. 插入数据到数据库
  5. 更新数据库中的数据
  6. 删除数据库中的数据
  7. 将数据导出到Excel文件

一、创建一个主窗口类,继承自QMainWindow,并设置基本的UI:

from PyQt5.QtWidgets import QApplication, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("PyQt5 MySQL示例")
        self.setGeometry(100, 100, 800, 600)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

二、连接到MySQL数据库

import pymysql

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("PyQt5 MySQL示例")
        self.setGeometry(100, 100, 800, 600)
        self.db = self.create_connection()

     def create_connection(self):
        try:
            connection = pymysql.connect(
                host="localhost",  # 数据库主机名
                user="root",       # 数据库用户名
                password="yourpassword",  # 数据库密码
                database="yourdatabase"   # 数据库名
            )
            print("成功连接到数据库")  # 连接成功时打印信息
            return connection  # 返回数据库连接对象
        except pymysql.MySQLError as e:
            print(f"连接数据库失败: {e}")  # 连接失败时打印错误信息
            return None  # 返回None表示连接失败

三、在表格中显示数据

from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("PyQt5 MySQL示例")
        self.setGeometry(100, 100, 800, 600)
        self.db = self.create_connection()
        self.table = QTableWidget(self)
        self.table.setGeometry(50, 50, 700, 500)
        self.search_all_data()

    def search_all_data(self):
        if self.db is None:
            return

        cursor = self.db.cursor()
        cursor.execute("SELECT name, sex, number, license, extime FROM yourtable")
        results = cursor.fetchall()
        self.table.setRowCount(len(results))
        self.table.setColumnCount(5)
        self.table.setHorizontalHeaderLabels(['姓名', '性别', '电话', '车牌号', '有效期'])

        for row_num, row_data in enumerate(results):
            for col_num, data in enumerate(row_data):
                self.table.setItem(row_num, col_num, QTableWidgetItem(str(data)))

四、插入数据到数据库

from PyQt5.QtWidgets import QPushButton, QLineEdit, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("PyQt5 MySQL示例")
        self.setGeometry(100, 100, 800, 600)
        self.db = self.create_connection()

        self.table = QTableWidget(self)
        self.table.setGeometry(50, 50, 700, 400)

        self.input_name = QLineEdit(self)
        self.input_name.setPlaceholderText("姓名")
        self.input_sex = QLineEdit(self)
        self.input_sex.setPlaceholderText("性别")
        self.input_number = QLineEdit(self)
        self.input_number.setPlaceholderText("电话")
        self.input_license = QLineEdit(self)
        self.input_license.setPlaceholderText("车牌号")
        self.input_extime = QLineEdit(self)
        self.input_extime.setPlaceholderText("有效期 (YYYY-MM-DD)")

        self.add_button = QPushButton("添加", self)
        self.add_button.clicked.connect(self.insert_data)

        layout = QVBoxLayout()
        layout.addWidget(self.input_name)
        layout.addWidget(self.input_sex)
        layout.addWidget(self.input_number)
        layout.addWidget(self.input_license)
        layout.addWidget(self.input_extime)
        layout.addWidget(self.add_button)

        container = QWidget()
        container.setLayout(layout)
        container.setGeometry(50, 500, 700, 100)
        self.setCentralWidget(container)

        self.search_all_data()

    def insert_data(self):
        name = self.input_name.text()
        sex = self.input_sex.text()
        number = self.input_number.text()
        license = self.input_license.text()
        extime = self.input_extime.text()

        if self.db is None:
            return

        cursor = self.db.cursor()
        insert_sql = "INSERT INTO yourtable (name, sex, number, license, extime) VALUES (%s, %s, %s, %s, %s)"
        cursor.execute(insert_sql, (name, sex, number, license, extime))
        self.db.commit()
        self.search_all_data()

五、更新数据库中的数据

def update_data(self, id, name, sex, number, license, extime):
    if self.db is None:
        return

    cursor = self.db.cursor()
    update_sql = "UPDATE yourtable SET name=%s, sex=%s, number=%s, license=%s, extime=%s WHERE id=%s"
    cursor.execute(update_sql, (name, sex, number, license, extime, id))
    self.db.commit()
    self.search_all_data()

六、删除数据库中的数据

def delete_data(self, id):
    if self.db is None:
        return

    cursor = self.db.cursor()
    delete_sql = "DELETE FROM yourtable WHERE id=%s"
    cursor.execute(delete_sql, (id,))
    self.db.commit()
    self.search_all_data()

七、将数据导出到Excel文件

import pandas as pd
from PyQt5.QtWidgets import QFileDialog

def export_data(self):
    if self.db is None:
        return

    cursor = self.db.cursor()
    cursor.execute("SELECT * FROM yourtable")
    results = cursor.fetchall()
    df = pd.DataFrame(results, columns=['ID', '姓名', '性别', '电话', '车牌号', '有效期'])

    file_path, _ = QFileDialog.getSaveFileName(self, '保存Excel文件', '', 'Excel 文件 (*.xlsx)')
    if file_path:
        df.to_excel(file_path, index=False)

通过以上步骤,你已经学会了如何使用PyQt5创建一个连接MySQL数据库的应用程序,并实现基本的CRUD操作和数据导出功能。你可以根据需要扩展和定制这个应用程序。

有任何需要请私信我!私信,私信!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1788751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下载安装RabbitMQ客户端(2024最新篇)

文章目录 RabbitMQ认知RabbitMQ下载RabbitMQ安装 更多相关内容可查看 RabbitMQ认知 定义:RabbitMQ是一个消息中间件,它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递…

详解MyBatis(三)

目录 1.#{} 和 ${} 1.1#{} 和${} 使用 Integer类型参数 String类型参数 1.2#{} 和 ${}区别 1.2.1#{}性能更高(预编译) 1.2.2#{}更安全(防止SQL注入) 1.3排序功能 1.4like查询 2.数据库连接池 2.1连接池介绍 2.2更换连接池…

http接口上传文件响应413:413 Request Entity Too Large

目录 一、场景简介二、异常展示三、原因四、解决 一、场景简介 1、服务端有经过nginx代理 2、上传文件超过5M时,响应码为413 3、上传文件小于5M时,上传正常 二、异常展示 三、原因 nginx限制了上传数据的大小 四、解决 扩大nginx上传数据的大小 步…

44-5 waf绕过 - SQL注入绕WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装sqlilabs靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、双写绕过 打开sql靶场的第一关:http://127.0.0.1/sqli-labs-master/Less-1/?id=1 验证一下waf是否开启防…

Win10下CodeBlock实现socket TCP server/client

文章目录 1 安装codeblock2 适配libws2_32.a库3 TCP socket工作原理4 代码实现服务端客户端5 运行效果1 安装codeblock 官方免费下载 值得一提的是,安装时,指定安装路径,其他默认安装即可 2 适配libws2_32.a库 默认安装,只有3个库,如果编译socket,需要专门的库libws2…

阿奇科技 简单java-swing计算器源码(可用于课设等)

此系统用的技术有java swing! 实现的功能: 加减乘除(可以进行小数运算) 清空数据 最小化 小巧方便,功能齐全! 页面截图: 源码地址:点击这里下载源码 获取全套代码,或咨询更多代码…

自动装车系统车辆定位-激光雷达解决方案

在自动装车系统中,激光雷达为车辆定位提供了一种高效且精确的解决方案。以下是关于这一解决方案的详细分析: 一、解决方案概述 激光雷达解决方案在自动装车系统中,通过发射激光束并接收目标反射回来的信号,来探测车辆的位置、状…

K8s(Kubernetes)常用命令

大家好,当谈及容器编排工具时,Kubernetes(常简称为K8s)无疑是当今最受欢迎和广泛使用的解决方案之一。作为一个开源的容器编排平台,Kubernetes 提供了丰富的功能,可以帮助开发人员和运维团队管理、部署和扩…

今日份动态规划学习(二维01背包+01背包变形)

目录 P1877 [HAOI2012] 音量调节 P1877 [HAOI2012] 音量调节 题解:一个入门级别的01背包问题,首先就是为什么能看出是01背包,因为只有两种状态,要不增大音量,要不减小音量,和01背包的选与不选非常近似。但…

计算机网络 —— 数据链路层(以太网)

计算机网络 —— 数据链路层(以太网) 什么是以太网以太网传输介质和拓扑结构的发展传输介质的发展:拓扑结构的发展: 10BASE-T 以太网适配器和MAC地址适配器(Adapter)MAC地址适配器与MAC地址的关系 MAC帧以太…

OpenCV中的圆形标靶检测——斑点检测算法(二)

前面的章节中我们已经大致介绍了算法流程,也对一些算法中用到的相关概念做了简要介绍,同时给出了算法调用的API,现在我们开始算法检测接口实现源码的分析。 1. 斑点的分组与加权 这里我们选择后者,先了解算法的处理流程,再分析各个模块的实现。算法流程图如下图所示,上一…

重生之 SpringBoot3 入门保姆级学习(10、日志基础与使用)

重生之 SpringBoot3 入门保姆级学习(10、日志基础使用) 3.1 日志基础3.2 使用日志3.2.1 基础使用3.2.2 调整日志级别3.2.3 带参数的日志 3.1 日志基础 SpringBoot 默认使用 SLF4j(Simple Logging Facade for Java)和 Logback 实现…

结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐?3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

C++标准模板(STL)- 迭代器库-迭代器适配器 - 逆序遍历的迭代器适配器

迭代器库-迭代器适配器 迭代器库提供了五种迭代器的定义,同时还提供了迭代器特征、适配器及相关的工具函数。 迭代器分类 迭代器共有五 (C17 前)六 (C17 起)种:遗留输入迭代器 (LegacyInputIterator) 、遗留输出迭代器 (LegacyOutputIterator) 、遗留向…

2024年城市建设与环境管理国际会议(ICUCEM 2024)

2024 International Conference on Urban Construction and Environmental Management 【1】大会信息 大会地点:中国成都 投稿邮箱:icucemsub-paper.com 【2】会议简介 2024年城市建设与环境管理国际会议是一个专注于探讨城市建设与环境管理前沿议题…

#02 安装指南:如何配置Stable Diffusion环境

文章目录 前言前置条件第1步:安装Python和PIP第2步:创建虚拟环境第3步:安装PyTorch和CUDA第4步:安装Stable Diffusion相关库第5步:测试环境结论 前言 在之前的文章中,我们介绍了Stable Diffusion基础入门和…

【ArcGIS微课1000例】0114:基于DEM地形数据整体抬升或下降高程

相关阅读:【GlobalMapper精品教程】083:基于DEM整体抬升或下降地形高程的两种方式 文章目录 一、任务分析二、栅格计算器简介三、地形整体修改四、注意事项一、任务分析 打开软件,加载配套实验数据中的0112.rar中的dem数据,如下所示,dem的高程范围为256.75~342.37米,现在…

QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox,可参见下面这篇文章 QT之动态加载下拉框(QComboBox) 同理QTreeWidget也可以实现动态加载,在一些异步加载数据,并且数据加载比较耗时,非常实用。 效果 原理分析 要实现此类效…

618精选网络安全书单:打造数字世界的钢铁长城!

文章目录 《内网渗透实战攻略》《Kali Linux高级渗透测试(原书第4版)》《CTF那些事儿》《权限提升技术:攻防实战与技巧》《数字政府网络安全合规性建设指南:密码应用与数据安全》《红蓝攻防:构建实战化网络安全防御体系…

ECharts 图形化看板 模板(简单实用)

目录 一、官网 二、模板 ①定义请求​编辑 ② 将请求统一管理,别的页面引用多个请求时更便于导入。​编辑 ③最终模板 三、执行效果 四、后端代码 4.1 controller 4.2 xml 4.3 测试接口 一、官网 获取 ECharts - 入门篇 - 使用手册 - Apache ECharts 二、…