import tkinter as tk
from tkinter import messagebox, simpledialog
import csv
# 学生类定义
class Student:
def __init__(self, student_id, name, age, gender, scores):
self.student_id = student_id # 学号
self.name = name # 姓名
self.age = age # 年龄
self.gender = gender # 性别
self.scores = scores # 学生成绩列表
def calculate_average(self):
"""计算学生的平均成绩"""
if not self.scores:
return 0 # 如果没有成绩,则返回0
return sum(self.scores) / len(self.scores)
# 学生管理系统类
class StudentManager:
def __init__(self):
self.students = [] # 存储所有学生的列表
def add_student(self, student):
"""添加新学生"""
if self.find_student(student.student_id):
raise ValueError("学生学号已存在")
self.students.append(student)
def delete_student(self, student_id):
"""删除指定学号的学生"""
self.students = [s for s in self.students if s.student_id != student_id]
def find_student(self, student_id):
"""查找学生"""
for student in self.students:
if student.student_id == student_id:
return student
return None
def rank_students(self):
"""获取学生排名"""
return sorted(self.students, key=lambda s: s.calculate_average(), reverse=True)
def count_students(self):
"""计算当前学生总人数"""
return len(self.students)
def display_all_students(self):
"""显示所有学生信息"""
for student in self.students:
print(f"学号: {student.student_id}, 姓名: {student.name}, 平均成绩: {student.calculate_average():.2f}")
def save_to_csv(self, filename):
"""将学生信息保存至CSV文件"""
with open(filename, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(["学号", "姓名", "年龄", "性别", "成绩"])
for student in self.students:
writer.writerow([student.student_id, student.name, student.age, student.gender, student.scores])
def load_from_csv(self, filename):
"""从CSV文件加载学生信息"""
try:
with open(filename, mode='r', newline='', encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # 跳过表头
for row in reader:
# row[0]: 学号, row[1]: 姓名, row[2]: 年龄, row[3]: 性别, row[4]: 成绩列表
student_id = row[0]
name = row[1]
age = int(row[2])
gender = row[3]
scores = list(map(int, row[4].strip("[]").split(","))) # 转换成整数列表
student = Student(student_id, name, age, gender, scores)
self.students.append(student)
except FileNotFoundError:
messagebox.showwarning("警告", "文件未找到。")
except Exception as e:
messagebox.showerror("错误", str(e))
# GUI用户界面设计
class StudentManagementSystemApp:
def __init__(self, root):
self.root = root
self.root.title("学生成绩管理系统")
self.manager = StudentManager()
# 主界面按钮
self.add_button = tk.Button(root, text="添加学生", command=self.add_student)
self.add_button.pack(pady=10)
self.delete_button = tk.Button(root, text="删除学生", command=self.delete_student)
self.delete_button.pack(pady=10)
self.find_button = tk.Button(root, text="查询学生", command=self.find_student)
self.find_button.pack(pady=10)
self.rank_button = tk.Button(root, text="排名学生", command=self.rank_students)
self.rank_button.pack(pady=10)
self.show_button = tk.Button(root, text="显示所有学生", command=self.show_all_students)
self.show_button.pack(pady=10)
self.save_button = tk.Button(root, text="保存到CSV", command=self.save_to_csv)
self.save_button.pack(pady=10)
self.load_button = tk.Button(root, text="从CSV加载", command=self.load_from_csv)
self.load_button.pack(pady=10)
def add_student(self):
"""添加学生信息"""
student_id = simpledialog.askstring("输入", "请输入学号:")
name = simpledialog.askstring("输入", "请输入姓名:")
age = simpledialog.askinteger("输入", "请输入年龄:")
gender = simpledialog.askstring("输入", "请输入性别:")
scores = simpledialog.askstring("输入", "请输入成绩 (以逗号分隔):")
scores = list(map(int, scores.split(','))) # 将成绩字符串转换为整数列表
if student_id and name and age and gender and scores:
try:
student = Student(student_id, name, age, gender, scores)
self.manager.add_student(student)
messagebox.showinfo("成功", "学生信息添加成功!")
except ValueError as e:
messagebox.showerror("错误", str(e))
else:
messagebox.showwarning("警告", "请填写所有信息。")
def delete_student(self):
"""删除学生信息"""
student_id = simpledialog.askstring("输入", "请输入要删除的学生学号:")
if student_id:
self.manager.delete_student(student_id)
messagebox.showinfo("成功", "学生信息删除成功!")
else:
messagebox.showwarning("警告", "请填写学号。")
def find_student(self):
"""查询学生信息"""
student_id = simpledialog.askstring("输入", "请输入学生学号:")
if student_id:
student = self.manager.find_student(student_id)
if student:
info = f"学号: {student.student_id}\n姓名: {student.name}\n年龄: {student.age}\n性别: {student.gender}\n成绩: {student.scores}\n平均成绩: {student.calculate_average():.2f}"
messagebox.showinfo("查询结果", info)
else:
messagebox.showwarning("结果", "未找到该学生信息。")
else:
messagebox.showwarning("警告", "请填写学号。")
def rank_students(self):
"""排名学生"""
ranked_students = self.manager.rank_students()
if ranked_students:
result = "学生排名:\n\n"
for student in ranked_students:
result += f"学号: {student.student_id}, 姓名: {student.name}, 平均成绩: {student.calculate_average():.2f}\n"
messagebox.showinfo("排名结果", result)
else:
messagebox.showwarning("警告", "没有学生信息可排名。")
def show_all_students(self):
"""显示所有学生信息"""
if self.manager.count_students() > 0:
result = "所有学生信息:\n\n"
for student in self.manager.students:
result += f"学号: {student.student_id}, 姓名: {student.name}, 平均成绩: {student.calculate_average():.2f}\n"
messagebox.showinfo("所有学生", result)
else:
messagebox.showwarning("警告", "没有学生信息可展示。")
def save_to_csv(self):
"""保存学生信息至CSV文件"""
filename = simpledialog.askstring("输入", "请输入文件名(不含扩展名):")
if filename:
self.manager.save_to_csv(f"{filename}.csv")
messagebox.showinfo("成功", "学生信息已成功保存至CSV文件。")
else:
messagebox.showwarning("警告", "请输入有效的文件名。")
def load_from_csv(self):
"""从CSV文件加载学生信息"""
filename = simpledialog.askstring("输入", "请输入要加载的文件名(不含扩展名):")
if filename:
self.manager.load_from_csv(f"{filename}.csv")
messagebox.showinfo("成功", "学生信息已成功从CSV文件加载。")
else:
messagebox.showwarning("警告", "请输入有效的文件名。")
# 主程序入口
if __name__ == "__main__":
root = tk.Tk()
app = StudentManagementSystemApp(root)
root.mainloop()