【项目实战】基于Python+PyQt5的GUI学生成绩管理系统(附完整源码)

1、项目说明

基于python+PyQt5的学生成绩管理系统项目实战

项目需要安装pycharm社区版或专业版都可,以及项目所需的所有模块

项目需要安装 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/
 
注:其他问题请参看视频讲解,都有介绍,一定要认真看完哦!
代码编写、视频录制不易,感谢您的支持,祝您学习愉快!
 

避免走丢,记得关注哦🌹🌹🌹

posted @ 2023-03-12 22:54  兵慌码乱  阅读(3821)  评论(0编辑  收藏  举报