使用PyQt5连接mysql数据库实现用户管理(增,删,改,查,附代码和完整界面)

news2024/11/30 2:37:15

一:环境搭建

首先本地需要安装python,PyQt5环境,我是用pip安装的

        python -m pip install PyQt5 或者 pip install PyQt5

        python -m pip install PyQt5-tools 或者 pip install PyQt5-tools

如果网络不好,还可以使用其他源

         pip install PyQt5-tools -i https://pypi.douban.com/simple

安装连接mysql的扩展,我这里使用pymysql

        pip install pymysql

至此,开发所需要的扩展已经准备完毕,下面进入开发

二:开发

(一)首先是整个页面的布局,我们定义一个网格QGridLayout,在里面放用户操作按钮和展示用户数据的表格,部分代码如下:

grid_layout = QGridLayout()
grid_layout.setSpacing(10)  # 设置布局组件间距
grid_layout.setContentsMargins(20, 20, 20, 20)  # 设置布局边距

button_layout = QHBoxLayout()
button_layout.addWidget(self.query_rating_btn)
button_layout.addWidget(self.update_rating_btn)
button_layout.addWidget(self.delte_rating_btn)

#增加用户按钮集合

user_button_layout = QHBoxLayout()
user_button_layout.addWidget(self.refresh_btn)
user_button_layout.addWidget(self.user_add_btn)

#布局按钮的位置

grid_layout.addLayout(button_layout, 2, 0, 1, 4)
grid_layout.addLayout(user_button_layout, 1, 8, 1, 2)

#展示用户数据的标题

header = list(df.columns)
self.model.setColumnCount(len(header))
self.model.setHorizontalHeaderLabels(header)

呈现页面如下:

(二)页面布局出来以后,下一步我们就是连接mysql进行数据的处理

我们先实现刷新功能,部分代码如下:

首先要清空view,获取数据以后重新更新view

#清空view

self.model.removeRows(0,self.model.rowCount())

#获取数据

sql_query = "SELECT id,name,sex,age,address,height FROM b_user"
cursor.execute(sql_query)
result = cursor.fetchall()

 if result:

    for row in result:
        id = QStandardItem(str(row[0]))
        name = QStandardItem(str(row[1]))
        sex = QStandardItem(str(row[2]))
        age = QStandardItem(str(row[3]))
        address = QStandardItem(str(row[4]))
        height = QStandardItem(str(row[5]))
        record = [id, name,sex,age,address,height]
        self.model.appendRow(record)
   

#更新view

 self.view.setModel(self.model)
 self.view.update()

这样点击刷新按钮,会渲染数据到view中,实现的效果如下:

(三)查询功能实现以后,我们开始添加数据到数据库,实现新增按钮的逻辑,这里点击新增按钮弹出一个对话框,然后填写数据,保存到数据库,部分代码如下:

#初始化新增对话框

class AddDataDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("新增用户数据")
        self.setGeometry(300, 300, 300, 200)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.name = QLineEdit()  # 添加文本框,
        self.name.setPlaceholderText("姓名")
        self.sex = QLineEdit()  # 添加文本框,
        self.sex.setPlaceholderText("性别")
        self.address = QLineEdit()  # 添加文本框
        self.address.setPlaceholderText("地址")
        self.height = QLineEdit()  # 添加文本框
        self.height.setPlaceholderText("身高")

   #保存到数据库

 try:
	with connection.cursor() as cursor:
		sql_check = "SELECT COUNT(*) FROM b_user WHERE name = %s"
		cursor.execute(sql_check, (name,))
		result = cursor.fetchone()
		if result[0] > 0:
			QMessageBox.warning(self, "警告", "用户已经存在!")
		else:
			# 插入新记录到表table1
			sql_insert = "INSERT INTO b_user (name, sex,age,height,address) VALUES (%s, %s,%s, %s,%s)"
			cursor.execute(sql_insert, (name, sex,age,height,address))
			connection.commit()
			QMessageBox.information(self, "成功", "结果已保存到数据库中!")
            finally:
                connection.close()
                self.connection = None

实现的效果图如下:

(四)新增实现以后,我们要编辑用户数据怎么办呢,可以在每行的数据后面增加编辑按钮

我们需要在渲染数据的时候增加一个编辑按钮,点击以后弹出编辑对话框,带入该行的数据,部分代码实现

#每行数据增加编辑

edit_button_item = ButtonItem("编辑")  # 创建按钮项并设置点击事件回调

record = [id, name,sex,age,address,height,edit_button_item]

self.model.appendRow(record)

#编辑对话框

class EditDataDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("编辑用户数据")
        self.setGeometry(300, 300, 300, 200)
        self.layout = QGridLayout()
        self.setLayout(self.layout)

        #添加文本框
        self.name = QLineEdit()  #
        self.sex = QLineEdit()
        self.address = QLineEdit()
        self.height = QLineEdit()
        self.age = QLineEdit()
        self.id = QLineEdit()
        self.id.setVisible(False)

#设置对话框的数据

 def set_text(self,arr):
        self.id.setText(arr[0])
        self.name.setText(arr[1])
        self.sex.setText(arr[2])
        self.address.setText(arr[4])
        self.height.setText(arr[5])
        self.age.setText(arr[3])

#更新到数据库

            try:
                with connection.cursor() as cursor:
                    sql_update = "UPDATE b_user SET name = %s,sex = %s,age = %s,height = %s,address = %s WHERE id = %s"
                    cursor.execute(sql_update, (name, sex, age, height, address, id))
                    connection.commit()
                    QMessageBox.information(self, "成功", "记录已更新!")

            finally:
                connection.close()
                self.refresh_user()
            dialog.deleteLater()  # 释放对话框资源

实现的效果图如下:

 

(五)最后我们实现删除功能,同样和编辑一样,在每一行增加删除按钮,点击弹窗确认删除弹框,确认以后删除

model = self.model()
if model is not None:
	id = model.item(row, 0).text()
	reply = QMessageBox.question(self, "确认",
								 "确定删除数据吗?",
								 QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
	if reply == QMessageBox.Yes:
		current_row = self.currentIndex().row()
		self.model().removeRow(current_row)
		self.del_data(id)

 效果图如下:

至此我们的用户管理查询,增加,修改,和删除已经实现,这里只是实现了基本功能,没有涉及数据的校验和页面交互的优化,后续我会持续优化代码,持续更新功能。

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

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

相关文章

C++中的继承(一)

文章目录 前言概念访问限定符基类和派生类的赋值转换继承中的作用域派生类的默认成员函数构造函数 拷贝构造析构函数 继承的其他一些细节 前言 我们之前说过,继承是面向对象的三大特性。 面向对象的三大特性: 封装、继承、多态。 封装在类和对象体现出…

大一python题库刷题训练,大一python填空题题库

大家好,给大家分享一下大一python题库及答案和分析,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 这篇文章主要介绍了大一python上机题库及答案,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完…

【线性代数】期末速通!

1. 行列式的性质 1.1 求一个行列式的值 特殊地,对角线左下全为0,结果为对角线乘积。行 r 列 c 1.2 性质 某行(列)加上或减去另一行(列)的几倍,行列式不变某行(列)乘 …

智能优化算法应用:基于海洋捕食者算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于海洋捕食者算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于海洋捕食者算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.海洋捕食者算法4.实验参数设定5.算法…

git-lfs基本知识讲解

目录 1. 基本知识2. 安装 1. 基本知识 git-lfs 是 Git Large File Storage 的缩写,是 Git 的一个扩展,用于处理大文件的版本控制。 它允许你有效地管理和存储大型二进制文件,而不会使 Git 仓库变得过大和不稳定。以下是一些与 git-lfs 相关…

mysql原理--InnoDB的表空间

1.概述 通过前边儿的内容大家知道, 表空间 是一个抽象的概念。 对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为 表名.ibd 的实际文件。可以把表空间想象成被切分为许许…

仿易订货的订货系统源码一般多少钱

易订货是一款面向中小企业的B2B电子商务平台,旨在提供一站式的采购和销售解决方案。不少批发商贸企业在数字化转型的时候会采用订货系统,今天我们谈谈仿易订货的订货系统源码需要多少钱。 这款订货系统是一款SaaS,所以它是不面向市场销售源码…

Java 第9章 房屋出租系统

设计 如图是系统的分层结构,包括了界面层、业务层和数据层。 单独建包:由于在实际开发过程中,可能会出现管理多个界面的情况,所以界面需要单独建包,其他同理。 开发任务:从界面层深入到业务层&#xff0c…

ce从初阶到大牛--函数

1、显示/etc/passwd文件中以bash结尾的行; grep "bash$" /etc/passwd2、找出/etc/passwd文件中的三位或四位数; grep -E \b[0-9]{3,4}\b /etc/passwd3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非…

产品定位后选择通过外包团队降低成本:迅腾文化的优势与实践

产品定位后选择通过外包团队降低成本:迅腾文化的优势与实践 在激烈的市场竞争中,产品定位是企业成功的关键。然而,仅凭优秀的产品定位并不足以确保企业的成功,如何在降低成本的同时保持产品质量和市场竞争力也是至关重要的。在这…

计算机网络:DNS域名解析系统

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

【TB作品】51单片机,语音出租车计价器

西交大题目 1.语音出租车计价器 一、功能要求: 1.具有可模拟出租车车轮转速传感器的硬件设计,可计量出租车所走的公 里数。 2.显示和语音播报里程、价格和等待红灯或堵车的计时价格: 3.具有等待计时功能 4.具有实时年月日显示和切换功能。 5.操作简单、界面友好。 二、设计建议…

委托线程安全

委托线程安全是指将对共享数据的访问委托给线程安全的类,从而避免在调用方代码中进行额外的同步控制。这可以通过将线程安全性限定在一个类内部来实现。以下是一个简单的例子: 假设有一个计数器类 Counter,它不是线程安全的。 public class…

数据手册Datasheet解读-MOS管笔记

数据手册Datasheet解读-MOS管笔记 NMOS应用场景一般特征第一个参数Vdss第二、三个参数Rds(on)、IdMOS管的散热绝对最大额定值第一个参数-Vd第二个参数-Vdgr第三个参数-Vg(栅源电压)第四个参数-Id第五个参数-Idm第六个参数-Ptot第七个参数-Viso第七和八的…

【合成数字】合成类游戏-uniapp项目开发流程详解

以前玩过2048游戏,从中发现规律,想到跟合成类游戏相似,知道为什么很相似吗,在这里,做一个数字合成游戏玩玩吧,感兴趣的话可以看看,这里给大家讲一讲数字合成游戏的开发过程。 文章目录 创建项目…

四. 基于环视Camera的BEV感知算法-BEVDet

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…

【Java】智慧工地系统:让建筑行业管理更简单

概述 智慧工地管理平台面向房建、能源、交通各类工地的管理者,通过AI视频、物联感知技术对工地场景中的施工机械、建筑材料、施工规范、施工环境监管、完善施工现场项目管控。实现项目管控、特种设备管理、绿色施工、工地巡检等业务功能,沉淀工地监管数…

6.鸿蒙app_hap_DevEco如何真机调试模式_app安装在手机中

真机调试 手机》设置》关于手机》HarmonyOS版本》软件版本,连续单击10次启动开发者模式 然后:设置》系统和更新》开发人员选项》打开USB调试功能。 电脑USB连接手机,手机USB连接类型,传文件(不要选择仅充电&#xf…

CAD 审图意见的导出

看图的时候喜欢在图上直接标注意见,但是如果还要再把意见一行一行的导出到word里面就很麻烦,在网上看了一个审图软件,报价要980,而且那个审图意见做的太复杂了。 我的需求就是把图上标的单行文字和多行文字直接导出来就行&#x…

MybatisPlus进阶,UUID VS SnowFlake(雪花算法)

目录 一、什么是MybatisPlus 为什么要学MybatisPlus? 特性: 二、快速入门 2.1快速初始化一个空的spring boot 项目 2.2配置依赖 2.3配置(连接数据库) 2.4在spring boot启动类中添加MapperScan注解,扫描Mapper文件夹: 2.5…