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

最近,对之前的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操作和数据导出功能。你可以根据需要扩展和定制这个应用程序。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3位运算符

前言 本文介绍的是位运算符,位运算可以理解成对二进制数字上的每一个位进行操作的运算,位运算分为 布尔位运算符 和 移位位运算符。 文章目录 前言一、位运算概览1、布尔位运算符1)按位与运算符 ( & )2)按位或运算符 ( | )3…

一款C#开源、简单、免费的屏幕录制和GIF动画制作神器

前言 今天要给大家推荐一款由C#语言开发且开源的操作简单、免费的屏幕录制和GIF动画制作神器:ScreenToGif 。 工具介绍 ScreenToGif 是一款免费的开源屏幕录制和GIF 制作工具。它可以帮助用户捕捉计算机屏幕上的实时动画,并将其保存为高质量的 GIF 图像…

【鸟哥】Linux笔记-硬件搭配

在Linux这个系统当中,几乎所有的硬件设备文件都在/dev这个目录内。打印机与软盘呢?分别是/dev/lp0, /dev/fd0。 几个常见的设备与其在Linux当中的文件名: 如果你的机器使用的是跟网际网络供应商 (ISP) 申请使用的云端…

Unity【入门】脚本基础

Unity脚本基础 文章目录 1、脚本基本规则1、创建规则2、MonoBehavior基类3、不继承MonoBehavior的类4、执行的先后顺序5、默认脚本内容 2、生命周期函数1、概念2、生命周期函数有哪些3、生命周期函数支持继承多态 3、Inspector窗口可编辑的变量4、Mono中的重要内容1、重要成员2…

thinkphp6 queue队列的maxTries自定义

前景需求:在我们用队列的时候发现maxtries的个数时255次,这个太影响其他队列任务 我目前使用的thinkphp版本是6.1 第一部定义一个新的类 CustomDataBase(我用的mysql数据库存放的队列) 重写__make 和createPlainPayload方法 …

第10周 企业认证、分布式事务,分布式锁方案落地

第10周 企业认证、分布式事务,分布式锁方案落地 ********************************************************************************************** 本周我们将对企业入驻认证的流程进行落地,并且结合分布式缓存中间件Redis与Redisson进行相关的技术方…

Easy RoCE:在SONiC交换机上一键启用无损以太网

RDMA(远程直接内存访问)技术是一种绕过 CPU 或操作系统,在计算机之间直接传输内存数据的技术。它释放了内存带宽和 CPU,使节点之间的通信具有更低的延迟和更高的吞吐量。目前,RDMA 技术已广泛应用于高性能计算、人工智…

web项目规范配置(husky、eslint、lint-staged、commit)

背景: 团队开发为了保证提交代码格式统一,通常在进行代码提交的时候对暂存区代码进行校验,如没有通过eslint(本例使用eslint)校验,则不能提交到远端。 安装依赖 husky 、eslint 、prettier 、lint-staged npm install husky e…

【Uniapp小程序】自定义导航栏uni-nav-bar滚动渐变色

效果图 新建activityScrollTop.js作为mixins export default {data() {return {navBgColor: "rgba(0,0,0,0)", // 初始背景颜色为完全透明navTextColor: "rgba(0,0,0,1)", // 初始文字颜色};},onPageScroll(e) {// 设置背景const newAlpha Math.min((e.s…

手机耳机哪个品牌音质好

在寻找音质出色的手机耳机时,品牌选择显得尤为重要。市场上众多知名品牌提供了各式各样的耳机产品,它们在音质、降噪功能、设计等方面各有千秋。以下是一些在音质上表现优异的手机耳机品牌的分析: 索尼:索尼的耳机以其卓越的降噪技…

Django企业招聘后台管理系统开发实战四

前言 首先我们看一下产品的需求背景,这个产品为了解决招聘面试的过程中,线下面试管理效率低,面试过程和结果不方便跟踪的痛点 招聘管理的系统几乎是每一家中小公司都需要的产品 我们以校园招聘的面试为例子来做 MVP 产品迭代 首先我们来看一下…

【网络安全的神秘世界】在win11搭建pikachu靶场

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 下载pikachu压缩包 https://github.com/zhuifengshaonianhanlu/pikachu 下载好的pikachu放在phpstudy_pro/www目录下 创建pikachu数据库 打开phpstudy软件…

容量为0多线程操作的SynchronousQueue(FIFO)

一:简介 SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take。SynchronousQueue的优点在于其直接性和高效性,它实现了线程间的即时数据交换,无需中间缓存,确保了数据传输的实时性和准确性,同时,其灵活的阻塞机…

恒压频比开环控制系统Matlab/Simulink仿真分析(SVPWM控制方式)

一、SVPWM 交流电机需要输入三相正弦电流的最终目的就是在电机空间形成圆形磁场,从而产生恒定的电磁转矩。把逆变器和交流电机视为一个整体,以圆形旋转磁场为目标来控制逆变器的工作,这种控制方法称为“磁链跟踪控制”,磁链轨迹的…

洛谷P1035 级数求和 题解

#题外话(第42篇题解) #先看题目 题目链接https://www.luogu.com.cn/problem/P1035#思路 没啥思路,这其实偏向模拟一点,按照题目说的做就行了。 #代码 原来是这个熊样的(都能AC,优化的问题) …

九阳股份的“而立危机”:业绩三连降,押注清洁赛道迷雾重重?

“致敬伟大的小问题”,这是步入而立之年的九阳股份(SZ:002242,下同“九阳”)新品发布会的主题,也是九阳过去30年发展历程的缩影。 在经历“宅经济”催生的流量井喷期后,厨房小家电市场受困于热度退潮的浅滩…

【spring】Spring Boot3.3.0发布啦

spring最新版本 springboot官网:Spring Boot :: Spring Boot Spring Boot 3.3 发行说明:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.3-Release-Notes 开发环境的要求对比表 Spring BootJDKSpringMavenGradle3.3.017 ~ 226.1…

《Ai企业级知识库》rasa-action编写顺序+实体拿取+rasa-X替代品+使用mysql作为知识库存储,根据知识库中数据回答

rasa-X替代-(预留坑位) GitHub - nesterapp/rasa-admin: An open-source alternative for Rasa-X 识别意图 小鸭子:ner_duckling(组件) 查找表:lookup tables ner_crf (可以是那种可列举的列表类型) 定…

C# 类型系统

1. 隐式类型 c#允许使用 var 声明变量,编译期会通过初始化语句右侧的表达式推断出变量的类型。 // i is compiled as an int var i 5;// s is compiled as a string var s "Hello";// a is compiled as int[] var a new[] { 0, 1, 2 };// expr is co…

TLS 协议流程

TLS 协议流程 背景简介TLS-RSATLS-DH总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内容并非完全…