学生成绩管理系统

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值