题目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_())
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 等控件来实现导入和导出功能,并在操作结果中弹出相应的提示框。