最近在学习GUI设计,分享做的一些小项目。
这篇文我们讲一下如何基于PyQt5和MySQL用Python制作简单的学生信息管理系统。
(由于内容比较多,我们分模块讲解。)
***添加博主vx(私信)获得源码和资源文件 ***
***不要要私信啦 博主在国外很忙 !!! 没时间看私信 ***
前言
当我们着手开发一款软件,得先有软件架构的思路。
我们先用PM的视角去了解它:
1.系统架构
我们把整个系统分为5个模块,并列出了各个模块的需求。
2.产品使用流程图
整个系统的操作流程也直观地体现出来了。
(逻辑性和条理性比较清晰。)
开发环境及工具如下:
操作系统:Win 10
Python版本:Python 3.8.6
开发工具:PyCharm专业版、MySQL、Navicat、PyQt5
一、Part1:数据库
我们直接使用数据库可视化工具Navicat生成需要的表和视图。
1、表
a.班级信息表
b.年级信息表
c.学生信息表
d.用户信息表
2、视图
a.班级和年级视图
b.学生信息视图
数据库的设计就完成了,后续使用只需向数据库中导入相关数据即可。
3、连接数据库
我们定义一个open()函数用于连接数据库:
# 连接数据库连接
def open():
db = pymysql.connect(host='localhost', user='root', password='111111', database="db_student",charset="utf8")
return db
( 数据库信息根据个人修改。)
4、数据库数据的增、删、改
我们定义一个exec()函数用于数据库数据的增、删、改:
# 数据库数据的增、删、改操作
def exec(sql,values):
db=open()
cursor = db.cursor() # 使用cursor获取操作游标
try:
cursor.execute(sql,values) # 执行增、删、改的SQL语句
db.commit()
return 1
except:
db.rollback()
return 0
finally:
cursor.close()
db.close()
5、数据库数据的查询
我们定义query()函数用于数据库数据带参数的精确查询:
# 带参数的精确查询
def query(sql,*keys):
db=open()
cursor = db.cursor()
cursor.execute(sql,keys) # 执行查询SQL语句
result = cursor.fetchall() # 记录查询结果
cursor.close()
db.close()
return result
我们定义query2()函数用于数据库数据不带参数的模糊查询:
# 不带参数的模糊查询
def query2(sql):
db=open()
cursor = db.cursor()
cursor.execute(sql) # 执行查询SQL语句
result = cursor.fetchall() # 记录查询结果
cursor.close()
db.close()
return result
6、用户信息
用户信息界面UI设计图如下:
将.ui转为.py文件后,我们还要进行以下功能的添加:
此处我们要注意的一点:
Qt Designer设计窗口.ui转为.py时,默认继承的是object类,为了各个窗口可以相互调用,我们需要将继承类手动改为QMainWindow,并添加__init__方法。
class Ui_MainWindow(QMainWindow):
# 构造方法
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮
self.setupUi(self) # 初始化窗体设置
a.显示用户信息
我们定义query()函数和getItem()来实现。
# 查询用户信息,并显示在表格中
def query(self):
self.tbUser.setRowCount(0) # 清空表格中的所有行
result = service.query("select * from tb_user") # 调用服务类中的公共方法执行查询语句
row = len(result) # 取得记录个数,用于设置表格的行数
self.tbUser.setRowCount(row) # 设置表格行数
self.tbUser.setColumnCount(2) # 设置表格列数
# 设置表格的标题名称
self.tbUser.setHorizontalHeaderLabels(['用户名称', '用户密码'])
for i in range(row): # 遍历行
for j in range(self.tbUser.columnCount()): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
self.tbUser.setItem(i, j, data) # 设置每个单元格的数据
# 获取选中的表格内容
def getItem(self, item):
if item.column() == 0: # 如果单击的是第一列
self.select = item.text() # 获取单击的单元格文本
self.editName.setText(self.select) # 显示在用户名称文本框中
b.用户信息的增、删、改
我们通过自定义add()、 edit()、delete()函数来实现。
# 添加用户信息
def add(self):
userName = self.editName.text() # 记录输入的用户名
userPwd = self.editPwd.text() # 记录输入的用户密码
if userName != "" and userPwd != "": # 判断用户名和密码不为空
# 执行添加语句
result=service.exec("insert into tb_user(userName,userPwd) values (%s,%s)",(userName,userPwd))
if result>0: # 如果结果大于0,说明添加成功
self.query() # 在表格中显示最新数据
QMessageBox.information(None, '提示', '信息添加成功!', QMessageBox.Ok)
else:
QMessageBox.warning(None, '警告', '请输入数据后,再执行相关操作!', QMessageBox.Ok)
# 修改用户信息
def edit(self):
try:
if self.select!="": # 判断是否选择了要修改的数据
userPwd = self.editPwd.text() # 记录修改的用户密码
if userPwd != "": # 判断密码不为空
# 执行修改操作
result=service.exec("update tb_user set userPwd= %s where userName=%s",(userPwd,self.select))
if result>0: # 如果结果大于0,说明修改成功
self.query() # 在表格中显示最新数据
QMessageBox.information(None, '提示', '信息修改成功!', QMessageBox.Ok)
except:
QMessageBox.warning(None, '警告', '请先选择要修改的数据!', QMessageBox.Ok)
# 删除用户信息
def delete(self):
try:
if self.select!="": # 判断是否选择了要删除的数据
# 执行删除操作
result=service.exec("delete from tb_user where userName= %s",(self.select,))
if result>0: # 如果结果大于0,说明删除成功
self<