【项目实战】基于Python+PyQt5的GUI学生成绩管理系统(附完整源码)
1、项目说明
基于python+PyQt5的学生成绩管理系统项目实战
项目需要安装pycharm社区版或专业版都可,以及项目所需的所有模块
项目需要安装 pyqt5及其他一些模块
安装命令如下:
- pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 模块名称
- 如安装 pyqt5:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
项目打包为exe文件需要安装pyinstaller
在项目终端中执行打包命令:pyinstaller -F -w main.py -i logo图片的地址
2、项目主要技术
-
python编程技术
-
pyqt5界面编程
-
python文件操作
3、项目结构
-
config.py 项目配置文件
-
findStudent.py 查询学生信息界面设计代码
-
index.py 程序主界面实现代码
-
modifyStudent.py 修改学生信息界面设计代码
-
main.py 登录界面设计与功能实现代码(项目入口)
4、项目主要功能
-
用户登录验证
-
学生信息管理
5、部分源码
index.py
"""
项目名称:python pyqt5学生成绩管理系统
作者:bhml
时间:2022/11/28
代码功能:主界面实现
"""
import json
import sys
from PyQt5.QtChart import QChart, QChartView, QPieSeries
from PyQt5.QtCore import *
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import *
import findStudent
import modifyStudent
# 主界面UI、布局
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1182, 669)
MainWindow.setMinimumSize(QSize(1182, 669))
MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget = QWidget(self.centralwidget)
self.widget.setGeometry(QRect(21, 21, 1150, 601))
self.widget.setObjectName("widget")
self.horizontalLayout6 = QHBoxLayout(self.widget)
self.horizontalLayout6.setContentsMargins(0, 0, 0, 0)
self.verticalLayout = QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton_save = QPushButton(self.widget)
self.pushButton_save.setObjectName("pushButton_save")
self.horizontalLayout.addWidget(self.pushButton_save)
self.pushButton = QPushButton(self.widget)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.pushButton_savaFile = QPushButton(self.widget)
self.pushButton_savaFile.setObjectName("pushButton_savaFile")
self.horizontalLayout.addWidget(self.pushButton_savaFile)
self.pushButton_deleteStudent = QPushButton(self.widget)
self.pushButton_deleteStudent.setObjectName("pushButton_deleteStudent")
self.horizontalLayout.addWidget(self.pushButton_deleteStudent)
self.pushButton_findStudent = QPushButton(self.widget)
self.pushButton_findStudent.setObjectName("pushButton_findStudent")
self.horizontalLayout.addWidget(self.pushButton_findStudent)
self.pushButton_modifyStudent = QPushButton(self.widget)
self.pushButton_modifyStudent.setObjectName("pushButton_modifyStudent")
self.horizontalLayout.addWidget(self.pushButton_modifyStudent)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_id = QLabel(self.widget)
self.label_id.setObjectName("label_id")
self.horizontalLayout_2.addWidget(self.label_id)
self.lineEdit = QLineEdit(self.widget)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout_2.addWidget(self.lineEdit)
self.label_name = QLabel(self.widget)
self.label_name.setObjectName("label_name")
self.horizontalLayout_2.addWidget(self.label_name)
self.lineEdit_2 = QLineEdit(self.widget)
self.lineEdit_2.setObjectName("lineEdit_2")
self.horizontalLayout_2.addWidget(self.lineEdit_2)
self.label_math = QLabel(self.widget)
self.label_math.setObjectName("label_math")
self.horizontalLayout_2.addWidget(self.label_math)
self.lineEdit_3 = QLineEdit(self.widget)
self.lineEdit_3.setObjectName("lineEdit_3")
self.horizontalLayout_2.addWidget(self.lineEdit_3)
self.label_english = QLabel(self.widget)
self.label_english.setObjectName("label_english")
self.horizontalLayout_2.addWidget(self.label_english)
self.lineEdit_4 = QLineEdit(self.widget)
self.lineEdit_4.setObjectName("lineEdit_4")
self.horizontalLayout_2.addWidget(self.lineEdit_4)
self.label_python = QLabel(self.widget)
self.label_python.setObjectName("label_python")
self.horizontalLayout_2.addWidget(self.label_python)
self.lineEdit_5 = QLineEdit(self.widget)
self.lineEdit_5.setObjectName("lineEdit_5")
self.horizontalLayout_2.addWidget(self.lineEdit_5)
self.pushButton_insertStudent = QPushButton(self.widget)
self.pushButton_insertStudent.setObjectName("pushButton_insertStudent")
self.horizontalLayout_2.addWidget(self.pushButton_insertStudent)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.tableWidget = QTableWidget(self.widget)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(7)
item = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
item = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, item)
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
self.verticalLayout.addWidget(self.tableWidget)
self.horizontalLayout6.addLayout(self.verticalLayout)
self.horizontalLayout5 = QHBoxLayout()
self.chartview = QChartView()
self.chartview.setRenderHint(QPainter.Antialiasing)
self.chartview.setObjectName("chartview")
self.horizontalLayout5.addWidget(self.chartview)
self.horizontalLayout6.addLayout(self.horizontalLayout5)
self.horizontalLayout6.setStretch(0, 2)
self.horizontalLayout6.setStretch(1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setGeometry(QRect(0, 0, 1082, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "python pyqt5学生成绩管理系统-bhml"))
self.pushButton.setText(_translate("MainWindow", "导入班级信息"))
self.pushButton_findStudent.setText(_translate("MainWindow", "查询学生信息"))
self.pushButton_savaFile.setText(_translate("MainWindow", "导出班级信息"))
self.pushButton_deleteStudent.setText('删除学生信息')
self.pushButton_modifyStudent.setText('修改学生信息')
self.pushButton_save.setText('保存数据')
self.label_id.setText(_translate("MainWindow", "学号"))
self.label_name.setText(_translate("MainWindow", "姓名"))
self.label_math.setText(_translate("MainWindow", "数学"))
self.label_english.setText(_translate("MainWindow", "英语"))
self.label_python.setText(_translate("MainWindow", "编程"))
self.pushButton_insertStudent.setText(_translate("MainWindow", "添加"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "学号"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "姓名"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "数学"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "英语"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "编程"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "总分"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "平均分"))
# 用户操作类(继承主界面UI)
class Index(QMainWindow):
def __init__(self):
super(Index, self).__init__()
self.index_ui = Ui_MainWindow()
self.index_ui.setupUi(self)
# 设置
self.index_ui.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.index_ui.pushButton_insertStudent.clicked.connect(self.insertStudent) # 新增信息
self.index_ui.pushButton.clicked.connect(self.inputFile) # 导入班级信息
self.index_ui.pushButton_savaFile.clicked.connect(self.saveFile) # 导出班级信息
self.index_ui.pushButton_findStudent.clicked.connect(self.findStudent) # 查询信息
self.index_ui.pushButton_deleteStudent.clicked.connect(self.deleteStudent) # 删除信息
self.index_ui.pushButton_modifyStudent.clicked.connect(self.modifyStudent) # 修改信息
self.index_ui.pushButton_save.clicked.connect(self.saveData) # 数据保存
# 初始化
try:
self.openDefaultData()
except:
pass
# 饼图可视化
def create_piechart(self):
notsix = 0
six = 0
seven = 0
eight = 0
nine = 0
sum = 0
series = QPieSeries()
for i in range(self.index_ui.tableWidget.rowCount()):
if self.index_ui.tableWidget.item(i, 6):
if float(self.index_ui.tableWidget.item(i, 6).text()) < 60:
notsix += 1
elif float(self.index_ui.tableWidget.item(i, 6).text()) < 70:
six += 1
elif float(self.index_ui.tableWidget.item(i, 6).text()) < 80:
seven += 1
elif float(self.index_ui.tableWidget.item(i, 6).text()) < 90:
eight += 1
elif float(self.index_ui.tableWidget.item(i, 6).text()) <= 100:
nine += 1
if notsix > 0:
series.append("0-60", notsix)
series0 = series.slices()[sum]
series0.setLabelVisible(True)
sum += 1
if six > 0:
series.append("60-70", six)
series0 = series.slices()[sum]
series0.setLabelVisible(True)
sum += 1
if seven > 0:
series.append("70-80", seven)
series0 = series.slices()[sum]
series0.setLabelVisible(True)
sum += 1
if eight > 0:
series.append("80-90", eight)
series0 = series.slices()[sum]
series0.setLabelVisible(True)
sum += 1
if nine > 0:
series.append("90-100", nine)
series0 = series.slices()[sum]
series0.setLabelVisible(True)
self.chart = QChart()
self.chart.addSeries(series)
self.chart.createDefaultAxes()
self.chart.setAnimationOptions(QChart.SeriesAnimations)
self.chart.setTitle("学生平均成绩统计")
self.chart.legend().setVisible(True)
self.chart.legend().setAlignment(Qt.AlignBottom)
self.index_ui.chartview.setChart(self.chart)
# 查询学生窗口显示
def findStudent(self):
self.findwindows = QDialog(self)
self.find_ui = findStudent.Ui_Form()
self.find_ui.setupUi(self.findwindows)
self.find_ui.pushButton.clicked.connect(self.findAction)
self.findwindows.show()
# 查询学生操作模块
def findAction(self):
self.find_ui.listWidget.clear()
lis = []
for i in range(self.index_ui.tableWidget.rowCount()):
if self.index_ui.tableWidget.item(i, 1):
if self.index_ui.tableWidget.item(i, 1).text() == self.find_ui.lineEdit.text():
lis.append([self.index_ui.tableWidget.item(i, _).text() for _ in range(7)])
if lis == []:
QMessageBox.critical(self, '警告', '查无此人!')
for i in range(len(lis)):
self.find_ui.listWidget.addItem(
f'学号:{lis[i][0]}\t姓名:{lis[i][1]}\t数学:{lis[i][2]}\t英语:{lis[i][3]}\t编程:{lis[i][4]}\t总分:{lis[i][5]}\t平均分:{lis[i][6]}')
# 导入班级信息
def inputFile(self):
try:
directory1 = QFileDialog.getOpenFileName(None, "选择文件", '', 'json(*.json)')
path = directory1[0]
if path != '':
with open(file=path, mode='r', encoding='utf8') as file:
items = json.load(file)['class']
self.index_ui.tableWidget.setRowCount(0)
self.index_ui.tableWidget.clearContents()
self.freshTable(items)
except:
QMessageBox.critical(self, '警告', '导入文件出错')
# 导出班级信息
def saveFile(self):
fileName2, ok2 = QFileDialog.getSaveFileName(None, "文件保存", '', 'json(*.json)')
save_path = fileName2
if save_path != '':
items = []
for i in range(self.index_ui.tableWidget.rowCount()):
lis = []
for g in range(self.index_ui.tableWidget.columnCount()): # 此处是7行
if self.index_ui.tableWidget.item(i, g):
lis.append(self.index_ui.tableWidget.item(i, g).text())
items.append(lis)
with open(file=save_path, mode='w+', encoding='utf8') as file:
file.write(json.dumps({"class": items}))
# 保存默认文件信息
def saveData(self):
items = []
for i in range(self.index_ui.tableWidget.rowCount()):
lis = []
for g in range(self.index_ui.tableWidget.columnCount()): # 此处是7行
if self.index_ui.tableWidget.item(i, g):
lis.append(self.index_ui.tableWidget.item(i, g).text())
items.append(lis)
with open(file='stuMsg.json', mode='w+', encoding='utf8') as file:
file.write(json.dumps({"class": items}))
QMessageBox.information(self, '通知', '数据保存成功')
# 打开默认文件信息
def openDefaultData(self):
with open(file='stuMsg.json', mode='r', encoding='utf8') as file:
items = json.load(file)['class']
self.index_ui.tableWidget.clear()
self.freshTable(items)
# 增加学生信息模块
def insertStudent(self):
try:
math = float(self.index_ui.lineEdit_3.text())
english = float(self.index_ui.lineEdit_4.text())
python = float(self.index_ui.lineEdit_5.text())
except:
QMessageBox.critical(self, '警告', '成绩请输入数字')
try:
id = self.index_ui.lineEdit.text()
name = self.index_ui.lineEdit_2.text()
if math == '' or english == '' or python == '' or id == '' or name == '':
QMessageBox.critical(self, '警告', '输入项不能为空')
exit()
if math > 100 or math < 0 or english > 100 or english < 0 or python > 100 or python < 0:
QMessageBox.critical(self, '警告', '成绩请大于0小于100')
exit()
sum = round(math + english + python, 2)
average = round(sum / 3, 2)
items = [[id,
name,
math,
english,
python,
sum,
average
]]
self.freshTable(items)
self.index_ui.lineEdit.clear()
self.index_ui.lineEdit_2.clear()
self.index_ui.lineEdit_3.clear()
self.index_ui.lineEdit_4.clear()
self.index_ui.lineEdit_5.clear()
except:
pass
# 删除学生信息模块
def deleteStudent(self):
self.index_ui.tableWidget.removeRow(self.index_ui.tableWidget.currentRow())
self.create_piechart()
# 修改学生信息窗口显示
def modifyStudent(self):
self.modify_windows = QDialog(self)
self.modify_ui = modifyStudent.Ui_Form()
self.modify_ui.setupUi(self.modify_windows)
i = self.index_ui.tableWidget.currentRow()
self.modify_ui.pushButton.clicked.connect(self.sureModify)
if i >= 0:
self.modify_ui.lineEdit.setText(self.index_ui.tableWidget.item(i, 0).text())
self.modify_ui.lineEdit_2.setText(self.index_ui.tableWidget.item(i, 1).text())
self.modify_ui.lineEdit_3.setText(self.index_ui.tableWidget.item(i, 2).text())
self.modify_ui.lineEdit_4.setText(self.index_ui.tableWidget.item(i, 3).text())
self.modify_ui.lineEdit_5.setText(self.index_ui.tableWidget.item(i, 4).text())
self.modify_windows.show()
else:
QMessageBox.critical(self, '警告', '请选择你要修改的学生')
# 修改学生信息模块
def sureModify(self):
try:
math = float(self.modify_ui.lineEdit_3.text())
english = float(self.modify_ui.lineEdit_4.text())
python = float(self.modify_ui.lineEdit_5.text())
except:
QMessageBox.critical(self, '警告', '成绩请输入数字')
try:
id = self.modify_ui.lineEdit.text()
name = self.modify_ui.lineEdit_2.text()
if math == '' or english == '' or python == '' or id == '' or name == '':
QMessageBox.critical(self, '警告', '输入项不能为空')
exit()
if math > 100 or math < 0 or english > 100 or english < 0 or python > 100 or python < 0:
QMessageBox.critical(self, '警告', '成绩请大于0小于100')
exit()
sum = round(math + english + python, 2)
average = round(sum / 3, 2)
items = [[id,
name,
math,
english,
python,
sum,
average
]]
for i in range(7):
newItem = QTableWidgetItem(str(items[0][i]))
self.index_ui.tableWidget.setItem(self.index_ui.tableWidget.currentRow(), i, newItem)
self.create_piechart()
except:
pass
# 主界面table刷新
def freshTable(self, items):
for i in range(len(items)):
item = items[i]
row = self.index_ui.tableWidget.rowCount()
self.index_ui.tableWidget.insertRow(row)
for j in range(len(item)):
item = QTableWidgetItem(str(items[i][j]))
self.index_ui.tableWidget.setItem(row, j, item)
self.create_piechart()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Index()
main.show()
sys.exit(app.exec_())
6、运行截图
7、项目总结
本项目是一个非常适合练手的项目,对我们的python编程技术结合pyqt5模块运用开发界面的提升有很大的帮助,推荐大家学习研究这个项目,搞懂其中的业务逻辑流程以及各个知识点非常关键。
项目资料截图:
资料获取地址:https://h5.m.taobao.com/awp/core/detail.htm?ft=t&id=692912597391
B站视频讲解地址:https://www.bilibili.com/video/BV1yd4y1H7G2/
注:其他问题请参看视频讲解,都有介绍,一定要认真看完哦!
代码编写、视频录制不易,感谢您的支持,祝您学习愉快!
避免走丢,记得关注哦🌹🌹🌹
版权声明:本文为博主兵慌码乱原创文章,请勿转载!