Python,要用pyqt5来实现

题目5 pyqt5 的学生基本信息管理和学生成
绩管理
基本信息管理模块的主要功能有学生信息的添加、删除、修改、显示和学生数据的导入导出,学生成绩管理模块的主要功能有统计课程最高分、最低分和平均分。要求按照面向对象思维进行编写,按照以下模式完成:
1、设计一个学生类,包含学号、姓名、语文成绩、数学成绩和英语成绩等数据成员。
2、引入OS模块,用于导入导出路径文件信息
3、设计一个学生管理类,用于定义各个模块的具体功能函数。
4、设计一个主菜单,两个子菜单,分别管理学生基本信息和学生成绩信息

基于new bing部分指引作答:
下面是使用PyQt5编写的学生基本信息管理和学生成绩管理的完整代码。代码中包含了学生类、学生管理类以及主菜单和子菜单的设计。

import os
import csv
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QMessageBox, QLabel, QLineEdit, QPushButton, QTextEdit, QFileDialog

class Student:
    def __init__(self, student_id, name, chinese_score, math_score, english_score):
        self.student_id = student_id
        self.name = name
        self.chinese_score = chinese_score
        self.math_score = math_score
        self.english_score = english_score

class StudentManagement:
    def __init__(self):
        self.students = []

    def add_student(self, student):
        self.students.append(student)

    def delete_student(self, student_id):
        for student in self.students:
            if student.student_id == student_id:
                self.students.remove(student)
                return True
        return False

    def update_student(self, student_id, new_name, new_chinese_score, new_math_score, new_english_score):
        for student in self.students:
            if student.student_id == student_id:
                student.name = new_name
                student.chinese_score = new_chinese_score
                student.math_score = new_math_score
                student.english_score = new_english_score
                return True
        return False

    def find_student(self, student_id):
        for student in self.students:
            if student.student_id == student_id:
                return student
        return None

    def export_students(self, file_path):
        with open(file_path, 'w', newline='') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(['学号', '姓名', '语文成绩', '数学成绩', '英语成绩'])
            for student in self.students:
                writer.writerow([student.student_id, student.name, student.chinese_score, student.math_score, student.english_score])

    def import_students(self, file_path):
        with open(file_path, 'r') as csvfile:
            reader = csv.reader(csvfile)
            next(reader)  # Skip header row
            for row in reader:
                student_id, name, chinese_score, math_score, english_score = row
                student = Student(student_id, name, chinese_score, math_score, english_score)
                self.students.append(student)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('学生信息管理系统')
        self.setGeometry(100, 100, 400, 300)

        self.student_management = StudentManagement()

        self.create_menu()

    def create_menu(self):
        main_menu = self.menuBar()
        student_menu = main_menu.addMenu('学生信息管理')
        score_menu = main_menu.addMenu('学生成绩管理')

        add_student_action = QAction('添加学生', self)
        add_student_action.triggered.connect(self.show_add_student_dialog)
        student_menu.addAction(add_student_action)

        delete_student_action = QAction('删除学生', self)
        delete_student_action.triggered.connect(self.show_delete_student_dialog)
        student_menu.addAction(delete_student_action)

        update_student_action = QAction('修改学生信息', self)
        update_student_action.triggered.connect(self.show_update_student_dialog)
        student_menu.addAction(update_student_action)

        display_students_action = QAction('显示学生信息', self)
        display_students_action.triggered.connect(self.show_display_students_dialog)
        student_menu.addAction(display_students_action)

        export_students_action = QAction('导出学生信息', self)
        export_students_action.triggered.connect(self.show_export_students_dialog)
        student_menu.addAction(export_students_action)

        import_students_action = QAction('导入学生信息', self)
        import_students_action.triggered.connect(self.show_import_students_dialog)
        student_menu.addAction(import_students_action)

        max_score_action = QAction('统计课程最高分', self)
        max_score_action.triggered.connect(self.show_max_score_dialog)
        score_menu.addAction(max_score_action)

        min_score_action = QAction('统计课程最低分', self)
        min_score_action.triggered.connect(self.show_min_score_dialog)
        score_menu.addAction(min_score_action)

        avg_score_action = QAction('统计课程平均分', self)
        avg_score_action.triggered.connect(self.show_avg_score_dialog)
        score_menu.addAction(avg_score_action)

    def show_add_student_dialog(self):
        dialog = AddStudentDialog(self)
        dialog.exec_()

    def show_delete_student_dialog(self):
        dialog = DeleteStudentDialog(self)
        dialog.exec_()

    def show_update_student_dialog(self):
        dialog = UpdateStudentDialog(self)
        dialog.exec_()

    def show_display_students_dialog(self):
        dialog = DisplayStudentsDialog(self)
        dialog.exec_()

    def show_export_students_dialog(self):
        dialog = ExportStudentsDialog(self)
        dialog.exec_()

    def show_import_students_dialog(self):
        dialog = ImportStudentsDialog(self)
        dialog.exec_()

    def show_max_score_dialog(self):
        dialog = MaxScoreDialog(self)
        dialog.exec_()

    def show_min_score_dialog(self):
        dialog = MinScoreDialog(self)
        dialog.exec_()

    def show_avg_score_dialog(self):
        dialog = AvgScoreDialog(self)
        dialog.exec_()

class AddStudentDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('添加学生')
        self.setGeometry(200, 200, 300, 200)

        self.student_management = parent.student_management

        self.student_id_label = QLabel('学号:', self)
        self.student_id_label.move(20, 20)
        self.student_id_edit = QLineEdit(self)
        self.student_id_edit.move(80, 20)

        self.name_label = QLabel('姓名:', self)
        self.name_label.move(20, 50)
        self.name_edit = QLineEdit(self)
        self.name_edit.move(80, 50)

        self.chinese_score_label = QLabel('语文成绩:', self)
        self.chinese_score_label.move(20, 80)
        self.chinese_score_edit = QLineEdit(self)
        self.chinese_score_edit.move(80, 80)

        self.math_score_label = QLabel('数学成绩:', self)
        self.math_score_label.move(20, 110)
        self.math_score_edit = QLineEdit(self)
        self.math_score_edit.move(80, 110)

        self.english_score_label = QLabel('英语成绩:', self)
        self.english_score_label.move(20, 140)
        self.english_score_edit = QLineEdit(self)
        self.english_score_edit.move(80, 140)

        self.add_button = QPushButton('添加', self)
        self.add_button.move(100, 170)
        self.add_button.clicked.connect(self.add_student)

    def add_student(self):
        student_id = self.student_id_edit.text()
        name = self.name_edit.text()
        chinese_score = self.chinese_score_edit.text()
        math_score = self.math_score_edit.text()
        english_score = self.english_score_edit.text()

        student = Student(student_id, name, chinese_score, math_score, english_score)
        self.student_management.add_student(student)
        QMessageBox.information(self, '提示', '学生添加成功!')
        self.close()

class DeleteStudentDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('删除学生')
        self.setGeometry(200, 200, 300, 100)

        self.student_management = parent.student_management

        self.student_id_label = QLabel('学号:', self)
        self.student_id_label.move(20, 20)
        self.student_id_edit = QLineEdit(self)
        self.student_id_edit.move(80, 20)

        self.delete_button = QPushButton('删除', self)
        self.delete_button.move(100, 50)
        self.delete_button.clicked.connect(self.delete_student)

    def delete_student(self):
        student_id = self.student_id_edit.text()
        if self.student_management.delete_student(student_id):
            QMessageBox.information(self, '提示', '学生删除成功!')
        else:
            QMessageBox.warning(self, '警告', '学号不存在!')
        self.close()

class UpdateStudentDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('修改学生信息')
        self.setGeometry(200, 200, 300, 250)

        self.student_management = parent.student_management

        self.student_id_label = QLabel('学号:', self)
        self.student_id_label.move(20, 20)
        self.student_id_edit = QLineEdit(self)
        self.student_id_edit.move(80, 20)

        self.name_label = QLabel('姓名:', self)
        self.name_label.move(20, 50)
        self.name_edit = QLineEdit(self)
        self.name_edit.move(80, 50)

        self.chinese_score_label = QLabel('语文成绩:', self)
        self.chinese_score_label.move(20, 80)
        self.chinese_score_edit = QLineEdit(self)
        self.chinese_score_edit.move(80, 80)

        self.math_score_label = QLabel('数学成绩:', self)
        self.math_score_label.move(20, 110)
        self.math_score_edit = QLineEdit(self)
        self.math_score_edit.move(80, 110)

        self.english_score_label = QLabel('英语成绩:', self)
        self.english_score_label.move(20, 140)
        self.english_score_edit = QLineEdit(self)
        self.english_score_edit.move(80, 140)

        self.update_button = QPushButton('修改', self)
        self.update_button.move(100, 180)
        self.update_button.clicked.connect(self.update_student)

    def update_student(self):
        student_id = self.student_id_edit.text()
        name = self.name_edit.text()
        chinese_score = self.chinese_score_edit.text()
        math_score = self.math_score_edit.text()
        english_score = self.english_score_edit.text()

        if self.student_management.update_student(student_id, name, chinese_score, math_score, english_score):
            QMessageBox.information(self, '提示', '学生信息修改成功!')
        else:
            QMessageBox.warning(self, '警告', '学号不存在!')
        self.close()

class DisplayStudentsDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('显示学生信息')
        self.setGeometry(200, 200, 400, 300)

        self.student_management = parent.student_management

        self.students_textedit = QTextEdit(self)
        self.students_textedit.setGeometry(20, 20, 360, 260)
        self.students_textedit.setReadOnly(True)

        self.display_students()

    def display_students(self):
        students_info = []
        students = self.student_management.students
        for student in students:
            info = f"学号: {student.student_id}\n姓名: {student.name}\n语文成绩: {student.chinese_score}\n数学成绩: {student.math_score}\n英语成绩: {student.english_score}\n"
            students_info.append(info)
        students_text = '\n'.join(students_info)
        self.students_textedit.setText(students_text)

class ExportStudentsDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('导出学生信息')
        self.setGeometry(200, 200, 300, 100)

        self.student_management = parent.student_management

        self.export_button = QPushButton('导出', self)
        self.export_button.move(100, 50)
        self.export_button.clicked.connect(self.export_students)

    def export_students(self):
        file_path, _ = QFileDialog.getSaveFileName(self, '导出学生信息', os.path.expanduser('~'), 'CSV Files (*.csv)')
        if file_path:
            self.student_management.export_students(file_path)
            QMessageBox.information(self, '提示', '学生信息导出成功!')
            self.close()

class ImportStudentsDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('导入学生信息')
        self.setGeometry(200, 200, 300, 100)

        self.student_management = parent.student_management

        self.import_button = QPushButton('导入', self)
        self.import_button.move(100, 50)
        self.import_button.clicked.connect(self.import_students)

    def import_students(self):
        file_path, _ = QFileDialog.getOpenFileName(self, '导入学生信息', os.path.expanduser('~'), 'CSV Files (*.csv)')
        if file_path:
            self.student_management.import_students(file_path)
            QMessageBox.information(self, '提示', '学生信息导入成功!')
            self.close()

class MaxScoreDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('统计课程最高分')
        self.setGeometry(200, 200, 300, 100)

        self.student_management = parent.student_management

        self.max_score_label = QLabel('', self)
        self.max_score_label.move(20, 20)

        self.calculate_max_score()

    def calculate_max_score(self):
        max_chinese_score = max(student.chinese_score for student in self.student_management.students)
        max_math_score = max(student.math_score for student in self.student_management.students)
        max_english_score = max(student.english_score for student in self.student_management.students)
        max_scores = f"语文最高分: {max_chinese_score}\n数学最高分: {max_math_score}\n英语最高分: {max_english_score}"
        self.max_score_label.setText(max_scores)

class MinScoreDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('统计课程最低分')
        self.setGeometry(200, 200, 300, 100)

        self.student_management = parent.student_management

        self.min_score_label = QLabel('', self)
        self.min_score_label.move(20, 20)

        self.calculate_min_score()

    def calculate_min_score(self):
        min_chinese_score = min(student.chinese_score for student in self.student_management.students)
        min_math_score = min(student.math_score for student in self.student_management.students)
        min_english_score = min(student.english_score for student in self.student_management.students)
        min_scores = f"语文最低分: {min_chinese_score}\n数学最低分: {min_math_score}\n英语最低分: {min_english_score}"
        self.min_score_label.setText(min_scores)

class AvgScoreDialog(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('统计课程平均分')
        self.setGeometry(200, 200, 300, 100)

        self.student_management = parent.student_management

        self.avg_score_label = QLabel('', self)
        self.avg_score_label.move(20, 20)

        self.calculate_avg_score()

    def calculate_avg_score(self):
        avg_chinese_score = sum(student.chinese_score for student in self.student_management.students) / len(self.student_management.students)
        avg_math_score = sum(student.math_score for student in self.student_management.students) / len(self.student_management.students)
        avg_english_score = sum(student.english_score for student in self.student_management.students) / len(self.student_management.students)
        avg_scores = f"语文平均分: {avg_chinese_score}\n数学平均分: {avg_math_score}\n英语平均分: {avg_english_score}"
        self.avg_score_label.setText(avg_scores)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7618871
  • 除此之外, 这篇博客: python中的抽象类中的 1.首先知道python中的抽象类其实就是一种代码规范,和前面两篇文章python中的单继承和python中的多继承说的都是一个道理归根到底都是为了代码规范,同样也是从Java中继承的思想,抽象类一般都是单继承,由于多个子类都需要继承同一个类,所以可以在抽象类中实现具体的方法,但是子类中还是要实现具体的方法,看下面的例子,抽象类中实现了文件打开和关闭操作,但是子类中还是定义了 读写功能,为了理解的简便还是可以直接理解成抽象类中不实现具体的方法,子类中必须实现具体的方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • import abc #利用abc模块实现抽象类
    
    class All_file(metaclass=abc.ABCMeta):
        all_type='file'
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def read(self):
            '子类必须定义读功能'
            with open('filaname') as f:
                pass
    
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def write(self):
            '子类必须定义写功能'
            pass
    
    class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('文本数据的读取方法')
        def write(self):
            print('文本数据的读取方法')
    
    class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('硬盘数据的读取方法')
    
        def write(self):
            print('硬盘数据的读取方法')
    
    class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('进程数据的读取方法')
    
        def write(self):
            print('进程数据的读取方法')
    
    wenbenwenjian=Txt()
    
    yingpanwenjian=Sata()
    
    jinchengwenjian=Process()
    
    #这样大家都是被归一化了,也就是一切皆文件的思想
    wenbenwenjian.read()
    yingpanwenjian.write()
    jinchengwenjian.read()
    
    print(wenbenwenjian.all_type)
    print(yingpanwenjian.all_type)
    print(jinchengwenjian.all_type)
    
    # 抽象类 : 规范
    # 一般情况下 单继承 能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
    # 多继承的情况 由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中
    
    
    # 抽象类还是接口类 : 面向对象的开发规范 所有的接口类和抽象类都不能实例化
    # java :
    # java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
    # 但对于多继承的需求,由于java本身语法的不支持,所以创建了接口Interface这个概念来解决多继承的规范问题
    
    # python
    # python中没有接口类  :
      #  python中自带多继承 所以我们直接用class来实现了接口类
    # python中支持抽象类  : 一般情况下 单继承  不能实例化
      #  且可以实现python代码
    

以下代码使用了PyQt5库来实现学生基本信息管理和学生成绩管理。主要功能如题目所述,包括学生信息的添加、删除、修改、显示和学生成绩的统计和导入导出。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox
from PyQt5.QtGui import QIcon
import csv
import os


# 学生类
class Student:
    def __init__(self, id, name, chinese_score, math_score, english_score):
        self.id = id
        self.name = name
        self.chinese_score = chinese_score
        self.math_score = math_score
        self.english_score = english_score


# 学生管理类
class StudentManager:
    def __init__(self):
        self.students = []

    # 添加学生信息
    def add_student(self, student):
        self.students.append(student)

    # 删除学生信息
    def remove_student(self, student):
        self.students.remove(student)

    # 修改学生信息
    def modify_student(self, index, student):
        self.students[index] = student

    # 显示所有学生信息
    def show_all_students(self):
        return self.students

    # 统计课程最高分、最低分和平均分
    def calculate_scores(self):
        chinese_scores = [s.chinese_score for s in self.students]
        math_scores = [s.math_score for s in self.students]
        english_scores = [s.english_score for s in self.students]
        return max(chinese_scores), max(math_scores), max(english_scores), \
               min(chinese_scores), min(math_scores), min(english_scores), \
               sum(chinese_scores) / len(chinese_scores), \
               sum(math_scores) / len(math_scores), \
               sum(english_scores) / len(english_scores)

    # 导入学生信息
    def import_students(self, file_path):
        try:
            with open(file_path, 'r') as f:
                reader = csv.reader(f)
                next(reader)  # 跳过标题行
                for row in reader:
                    id, name, chinese_score, math_score, english_score = row
                    student = Student(id, name, int(chinese_score), int(math_score), int(english_score))
                    self.add_student(student)
            return True
        except Exception as e:
            print(e)
            return False

    # 导出学生信息
    def export_students(self, file_path):
        try:
            with open(file_path, 'w', newline='') as f:
                writer = csv.writer(f)
                writer.writerow(["学号", "姓名", "语文成绩", "数学成绩", "英语成绩"])
                for student in self.students:
                    writer.writerow([student.id, student.name, student.chinese_score,
                                     student.math_score, student.english_score])
            return True
        except Exception as e:
            print(e)
            return False


# 学生基本信息管理窗口
class BasicInfoWindow(QMainWindow):
    def __init__(self, student_manager):
        super().__init__()
        self.student_manager = student_manager
        self.setWindowTitle("学生基本信息管理")
        self.setGeometry(200, 200, 600, 400)

        # 添加菜单栏和工具栏
        self.init_ui()

    def init_ui(self):
        # 菜单栏
        menu_bar = self.menuBar()

        # 文件菜单
        file_menu = menu_bar.addMenu("文件")

        import_action = file_menu.addAction("导入")
        import_action.triggered.connect(self.import_students)

        export_action = file_menu.addAction("导出")
        export_action.triggered.connect(self.export_students)

        # 编辑菜单
        edit_menu = menu_bar.addMenu("编辑")

        add_action = edit_menu.addAction("添加")
        add_action.triggered.connect(self.add_student)

        delete_action = edit_menu.addAction("删除")
        delete_action.triggered.connect(self.delete_student)

        modify_action = edit_menu.addAction("修改")
        modify_action.triggered.connect(self.modify_student)

        # 工具栏
        tool_bar = self.addToolBar("工具栏")

        add_tool_action = tool_bar.addAction(QIcon("add.png"), "添加")
        add_tool_action.triggered.connect(self.add_student)

        delete_tool_action = tool_bar.addAction(QIcon("delete.png"), "删除")
        delete_tool_action.triggered.connect(self.delete_student)

        modify_tool_action = tool_bar.addAction(QIcon("modify.png"), "修改")
        modify_tool_action.triggered.connect(self.modify_student)

        # 状态栏
        self.statusBar().showMessage("学生基本信息管理")

    # 添加学生信息功能
    def add_student(self):
        id, ok = QInputDialog.getText(self, "添加学生信息", "请输入学号:")
        if ok and id:
            name, ok = QInputDialog.getText(self, "添加学生信息", "请输入姓名:")
            if ok and name:
                chinese_score, ok = QInputDialog.getInt(self, "添加学生信息", "请输入语文成绩:")
                if ok and chinese_score:
                    math_score, ok = QInputDialog.getInt(self, "添加学生信息", "请输入数学成绩:")
                    if ok and math_score:
                        english_score, ok = QInputDialog.getInt(self, "添加学生信息", "请输入英语成绩:")
                        if ok and english_score:
                            student = Student(id, name, chinese_score, math_score, english_score)
                            self.student_manager.add_student(student)
                            QMessageBox.information(self, "添加学生信息", "添加成功!")

    # 删除学生信息功能
    def delete_student(self):
        students = self.student_manager.show_all_students()
        if len(students) == 0:
            QMessageBox.information(self, "删除学生信息", "学生信息为空!")
            return

        items = [f"{student.id} {student.name}" for student in students]
        item, ok = QInputDialog.getItem(self, "删除学生信息", "请选择要删除的学生:", items, 0, False)
        if ok and item:
            index = items.index(item)
            student = students[index]
            self.student_manager.remove_student(student)
            QMessageBox.information(self, "删除学生信息", "删除成功!")

    # 修改学生信息功能
    def modify_student(self):
        students = self.student_manager.show_all_students()
        if len(students) == 0:
            QMessageBox.information(self, "修改学生信息", "学生信息为空!")
            return

        items = [f"{student.id} {student.name}" for student in students]
        item, ok = QInputDialog.getItem(self, "修改学生信息", "请选择要修改的学生:", items, 0, False)
        if ok and item:
            index = items.index(item)
            student = students[index]

            new_id, ok = QInputDialog.getText(self, "修改学生信息", f"请输入新的学号({student.id}):")
            if ok and new_id:
                student.id = new_id

            new_name, ok = QInputDialog.getText(self, "修改学生信息", f"请输入新的姓名({student.name}):")
            if ok and new_name:
                student.name = new_name

            new_chinese_score, ok = QInputDialog.getInt(self, "修改学生信息", f"请输入新的语文成绩({student.chinese_score}):")
            if ok and new_chinese_score:
                student.chinese_score = new_chinese_score

            new_math_score, ok = QInputDialog.getInt(self, "修改学生信息", f"请输入新的数学成绩({student.math_score}):")
            if ok and new_math_score:
                student

本回答基于GPT
以下是一个使用 PyQt5 实现的学生基本信息管理和学生成绩管理的示例代码:

import sys
import os
import csv
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, QMessageBox, QFileDialog


class Student:
    def __init__(self, id, name, chinese, math, english):
        self.id = id
        self.name = name
        self.chinese = chinese
        self.math = math
        self.english = english


class StudentManager:
    def __init__(self):
        self.students = []

    def add_student(self, student):
        self.students.append(student)

    def remove_student(self, id):
        for student in self.students:
            if student.id == id:
                self.students.remove(student)
                return True
        return False

    def update_student(self, id, name, chinese, math, english):
        for student in self.students:
            if student.id == id:
                student.name = name
                student.chinese = chinese
                student.math = math
                student.english = english
                return True
        return False

    def get_student(self, id):
        for student in self.students:
            if student.id == id:
                return student
        return None

    def get_students(self):
        return self.students

    def import_students(self, file_path):
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                reader = csv.reader(f)
                for row in reader:
                    id, name, chinese, math, english = row
                    student = Student(id, name, int(chinese), int(math), int(english))
                    self.add_student(student)
            return True
        except Exception as e:
            print(e)
            return False

    def export_students(self, file_path):
        try:
            with open(file_path, 'w', encoding='utf-8', newline='') as f:
                writer = csv.writer(f)
                for student in self.students:
                    writer.writerow([student.id, student.name, student.chinese, student.math, student.english])
            return True
        except Exception as e:
            print(e)
            return False

    def get_highest_score(self, subject):
        max_score = 0
        for student in self.students:
            score = getattr(student, subject)
            if score > max_score:
                max_score = score
        return max_score

    def get_lowest_score(self, subject):
        min_score = 100
        for student in self.students:
            score = getattr(student, subject)
            if score < min_score:
                min_score = score
        return min_score

    def get_average_score(self, subject):
        total_score = 0
        count = len(self.students)
        for student in self.students:
            score = getattr(student, subject)
            total_score += score
        return total_score / count

StudentInfoUI

class StudentInfoUI(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        label_id = QLabel('学号', self)
        label_id.move(50, 50)
        self.edit_id = QLineEdit(self)
        self.edit_id.move(100, 50)

        label_name = QLabel('姓名', self)
        label_name.move(50, 100)
        self.edit_name = QLineEdit(self)
        self.edit_name.move(100, 100)

        label_chinese = QLabel('语文', self)
        label_chinese.move(50, 150)
        self.edit_chinese = QLineEdit(self)
        self.edit_chinese.move(100, 150)

        label_math = QLabel('数学', self)
        label_math.move(50, 200)
        self.edit_math = QLineEdit(self)
        self.edit_math.move(100, 200)

        label_english = QLabel('英语', self)
        label_english.move(50, 250)
        self.edit_english = QLineEdit(self)
        self.edit_english.move(100, 250)

        btn_add = QPushButton('添加', self)
        btn_add.move(50, 300)
        btn_add.clicked.connect(self.add_student)

        btn_remove = QPushButton('删除', self)
        btn_remove.move(150, 300)
        btn_remove.clicked.connect(self.remove_student)

        btn_update = QPushButton('修改', self)
        btn_update.move(250, 300)
        btn_update.clicked.connect(self.update_student)

        btn_import = QPushButton('导入', self)
        btn_import.move(50, 350)
        btn_import.clicked.connect(self.import_students)

        btn_export = QPushButton('导出', self)
        btn_export.move(150, 350)
        btn_export.clicked.connect(self.export_students)

        self.setGeometry(300, 300, 400, 400)
        self.setWindowTitle('学生信息管理')

以上是一个用 PyQt5 实现的学生基本信息管理的 UI 类。下面是一个用 PyQt5 实现的学生成绩管理的 UI 类:

class ScoreUI(QWidget):
    def __init__(self, student_manager):
        super().__init__()
        self.student_manager = student_manager
        self.init_ui()

    def init_ui(self):
        label_subject = QLabel('科目', self)
        label_subject.move(50, 50)
        self.edit_subject = QLineEdit(self)
        self.edit_subject.move(100, 50)

        label_highest_score = QLabel('最高分', self)
        label_highest_score.move(50, 100)
        self.label_highest_score_value = QLabel('', self)
        self.label_highest_score_value.move(100, 100)

        label_lowest_score = QLabel('最低分', self)
        label_lowest_score.move(50, 150)
        self.label_lowest_score_value = QLabel('', self)
        self.label_lowest_score_value.move(100, 150)

        label_average_score = QLabel('平均分', self)
        label_average_score.move(50, 200)
        self.label_average_score_value = QLabel('', self)
        self.label_average_score_value.move(100, 200)

        btn_calculate = QPushButton('计算', self)
        btn_calculate.move(50, 250)
        btn_calculate.clicked.connect(self.calculate_score)

        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle('学生成绩管理')

    def calculate_score(self):
        subject = self.edit_subject.text()
        if subject == '':
            QMessageBox.warning(self, '警告', '请输入科目')
            return
        highest_score = self.student_manager.get_highest_score(subject)
        lowest_score = self.student_manager.get_lowest_score(subject)
        average_score = self.student_manager.get_average_score(subject)
        self.label_highest_score_value.setText(str(highest_score))
        self.label_lowest_score_value.setText(str(lowest_score))
        self.label_average_score_value.setText(str(average_score))

最后,可以在主程序中创建一个主菜单和两个子菜单,分别管理学生基本信息和学生成绩信息。下面是一个简单的示例:

if __name__ == '__main__':
    app = QApplication(sys.argv)

    student_manager = StudentManager()

    main_menu = QMenuBar()
    info_menu = main_menu.addMenu('学生基本信息')
    score_menu = main_menu.addMenu('学生成绩信息')

    add_action = info_menu.addAction('添加学生')
    add_action.triggered.connect(lambda: StudentInfoUI().show())

    import_action = info_menu.addAction('导入学生')
    import_action.triggered.connect(lambda: import_students(student_manager))

    export_action = info_menu.addAction('导出学生')
    export_action.triggered.connect(lambda: export_students(student_manager))

    calculate_action = score_menu.addAction('计算成绩')
    calculate_action.triggered.connect(lambda: ScoreUI(student_manager).show())

    win = QWidget()
    win.setGeometry(300, 300, 300, 300)
    win.setMenuBar(main_menu)
    win.setWindowTitle('学生管理系统')
    win.show()

    sys.exit(app.exec_())

def import_students(student_manager):
    file_path, _ = QFileDialog.getOpenFileName(None, '选择文件', '.', 'CSV Files (*.csv)')
    if file_path != '':
        if student_manager.import_students(file_path):
            QMessageBox.information(None, '提示', '导入成功')
        else:
            QMessageBox.warning(None, '警告', '导入失败')

def export_students(student_manager):
    file_path, _ = QFileDialog.getSaveFileName(None, '保存文件', '.', 'CSV Files (*.csv)')
    if file_path != '':
        if student_manager.export_students(file_path):
            QMessageBox.information(None, '提示', '导出成功')
        else:
            QMessageBox.warning(None, '警告', '导出失败')

首先,在学生基本信息管理模块中,我们定义了一个 Student 类来表示学生,包含学号、姓名、语文成绩、数学成绩和英语成绩等数据成员。在 StudentManager 类中,我们定义了各个模块的具体功能函数,包括添加、删除、修改、显示和学生数据的导入导出等。这些函数都是按照面向对象思维进行编写的。

在学生成绩管理模块中,我们同样使用了 StudentManager 类来实现统计课程最高分、最低分和平均分等功能。这些函数都是通过遍历学生列表来实现的。

接下来,我们使用 PyQt5 来实现学生基本信息管理和学生成绩管理的 UI 界面。在 StudentInfoUI 类中,我们使用了 QLabel、QLineEdit 和 QPushButton 等控件来构建一个简单的界面,包括学号、姓名、语文成绩、数学成绩和英语成绩等输入框和添加、删除、修改、导入和导出等按钮。在按钮的 clicked 事件中,我们调用了相应的 StudentManager 类函数来实现对学生信息的操作。

在 ScoreUI 类中,我们同样使用了 QLabel 和 QLineEdit 等控件来构建界面,包括科目、最高分、最低分和平均分等输入框和计算按钮。在计算按钮的 clicked 事件中,我们调用了 StudentManager 类的相应函数来计算课程的最高分、最低分和平均分,并将结果显示在对应的输入框中。

最后,我们在主程序中创建了一个主菜单和两个子菜单,分别管理学生基本信息和学生成绩信息。使用 QMenuBar、QMenu 和 QAction 等控件来实现菜单功能,并将菜单项的 triggered 事件与相应的 UI 类的 show 函数连接起来,从而实现在菜单项点击时弹出相应的 UI 界面。同时,我们还使用了 QFileDialog 和 QMessageBox 等控件来实现导入和导出功能,并在操作结果中弹出相应的提示框。