以下是完整代码,已修改并添加了必要的部分,可以实现所有要求的功能:

import tkinter as tk from tkinter import filedialog, messagebox import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class GradeManagementSystem: def init(self, master): self.master = master self.master.title('成绩管理系统') self.master.geometry('800x600')

    self.data = pd.DataFrame(columns=['班级', '姓名', '学号', '语文', '数学', '英语', '总分', '平均分'])
    self.current_class = None

    tk.Label(self.master, text='成绩管理系统', font=('Arial', 16)).pack(pady=10)

    tk.Button(self.master, text='加载数据', command=self.load_data).pack(pady=10)
    tk.Button(self.master, text='录入成绩', command=self.add_grade).pack(pady=10)
    tk.Button(self.master, text='查询成绩', command=self.search_grade).pack(pady=10)
    tk.Button(self.master, text='排序成绩', command=self.sort_grade).pack(pady=10)
    tk.Button(self.master, text='查找学生', command=self.find_student).pack(pady=10)
    tk.Button(self.master, text='导出数据', command=self.export_data).pack(pady=10)
    tk.Button(self.master, text='生成图表', command=self.plot_scores).pack(pady=10)

    self.grade_table = tk.Frame(self.master)
    self.grade_table.pack(pady=20)

def load_data(self):
    file_path = filedialog.askopenfilename(title='选择文件')
    if file_path.endswith('.xlsx') or file_path.endswith('.xls'):
        self.data = pd.read_excel(file_path)
        tk.messagebox.showinfo(title='提示', message='数据加载成功')
        self.current_class = None
        self.grade_table()
    else:
        tk.messagebox.showerror(title='错误', message='请选择Excel文件')

def add_grade(self):
    add_window = tk.Toplevel(self.master)
    add_window.title('录入成绩')
    add_window.geometry('300x250')

    tk.Label(add_window, text='请选择班级:').pack(pady=10)
    class_var = tk.StringVar(add_window)
    class_var.set(self.current_class)
    class_menu = tk.OptionMenu(add_window, class_var, *self.data['班级'].unique())
    class_menu.pack()

    tk.Label(add_window, text='请输入姓名:').pack(pady=10)
    name_entry = tk.Entry(add_window)
    name_entry.pack()

    tk.Label(add_window, text='请输入学号:').pack(pady=10)
    id_entry = tk.Entry(add_window)
    id_entry.pack()

    tk.Label(add_window, text='请输入语文成绩:').pack(pady=10)
    chinese_entry = tk.Entry(add_window)
    chinese_entry.pack()

    tk.Label(add_window, text='请输入数学成绩:').pack(pady=10)
    math_entry = tk.Entry(add_window)
    math_entry.pack()

    tk.Label(add_window, text='请输入英语成绩:').pack(pady=10)
    english_entry = tk.Entry(add_window)
    english_entry.pack()

    def add():
        class_name = class_var.get()
        name = name_entry.get()
        student_id = id_entry.get()
        chinese = chinese_entry.get()
        math = math_entry.get()
        english = english_entry.get()
        if class_name and name and student_id and chinese and math and english:
            try:
                chinese = float(chinese)
                math = float(math)
                english = float(english)
                total = chinese + math + english
                average = total / 3
                new_data = pd.DataFrame([[class_name, name, student_id, chinese, math, english, total, average]],
                                        columns=['班级', '姓名', '学号', '语文', '数学', '英语', '总分', '平均分'])
                self.data = pd.concat([self.data, new_data], ignore_index=True)
                tk.messagebox.showinfo(title='提示', message='成绩录入成功')
                self.grade_table()
            except ValueError:
                tk.messagebox.showerror(title='错误', message='成绩必须为数字')
        else:
            tk.messagebox.showerror(title='错误', message='所有字段均为必填项')

    tk.Button(add_window, text='录入', command=add).pack(pady=10)

def search_grade(self):
    search_window = tk.Toplevel(self.master)
    search_window.title('查询成绩')
    search_window.geometry('300x200')

    tk.Label(search_window, text='请输入学号或姓名:').pack(pady=10)
    search_entry = tk.Entry(search_window)
    search_entry.pack()

    def search():
        keyword = search_entry.get()
        if keyword:
            result = self.data.loc[(self.data['姓名'] == keyword) | (self.data['学号'] == keyword)]
            if len(result) > 0:
                tk.messagebox.showinfo(title='查询结果', message=result.to_string(index=False))
            else:
                tk.messagebox.showerror(title='错误', message='未找到学生信息')
        else:
            tk.messagebox.showerror(title='错误', message='请输入关键词')

    tk.Button(search_window, text='查询', command=search).pack(pady=10)

def sort_grade(self):
    sort_window = tk.Toplevel(self.master)
    sort_window.title('排序成绩')
    sort_window.geometry('300x200')

    tk.Label(sort_window, text='请选择排序方式:').pack(pady=10)
    sort_var = tk.StringVar(sort_window, '总分')
    tk.Radiobutton(sort_window, text='总分', variable=sort_var, value='总分').pack()
    tk.Radiobutton(sort_window, text='平均分', variable=sort_var, value='平均分').pack()

    tk.Label(sort_window, text='请选择班级(可选):').pack(pady=10)
    class_var = tk.StringVar(sort_window)
    class_menu = tk.OptionMenu(sort_window, class_var, *['所有班级']+list(self.data['班级'].unique()))
    class_menu.pack()

    def sort():
        sort_col = sort_var.get()
        class_name = class_var.get()
        if sort_col:
            if class_name != '所有班级':
                self.current_class = class_name
                self.grade_table()
                data = self.data.loc[self.data['班级'] == class_name]
            else:
                self.current_class = None
                self.grade_table()
                data = self.data
            data.sort_values(by=sort_col, ascending=False, inplace=True)
            tk.messagebox.showinfo(title='提示', message='排序成功')
            self.grade_table()
        else:
            tk.messagebox.showerror(title='错误', message='请选择排序方式')

    tk.Button(sort_window, text='排序', command=sort).pack(pady=10)

def find_student(self):
    find_window = tk.Toplevel(self.master)
    find_window.title('查找学生')
    find_window.geometry('300x200')

    tk.Label(find_window, text='请输入学号:').pack(pady=10)
    find_entry = tk.Entry(find_window)
    find_entry.pack()

    def find():
        student_id = find_entry.get()
        if student_id:
            result = self.data.loc[self.data['学号'] == student_id]
            if len(result) > 0:
                tk.messagebox.showinfo(title='查询结果', message=result.to_string(index=False))
            else:
                tk.messagebox.showerror(title='错误', message='未找到学生信息')
        else:
            tk.messagebox.showerror(title='错误', message='请输入学号')

    tk.Button(find_window, text='查找', command=find).pack(pady=10)

def export_data(self):
    file_path = filedialog.asksaveasfilename(title='保存文件', defaultextension='.xlsx')
    if file_path:
        self.data.to_excel(file_path, index=False)
        tk.messagebox.showinfo(title='提示', message='导出成功')

def plot_scores(self):
    plot_window = tk.Toplevel(self.master)
    plot_window.title('生成图表')
    plot_window.geometry('400x300')

    tk.Label(plot_window, text='请选择班级(可选):').pack(pady=10)
    class_var = tk.StringVar(plot_window)
    class_menu = tk.OptionMenu(plot_window, class_var, *['所有班级']+list(self.data['班级'].unique()))
    class_menu.pack()

    tk.Label(plot_window, text='请选择学科:').pack(pady=10)
    subject_var = tk.StringVar(plot_window, '语文')
    tk.Radiobutton(plot_window, text='语文', variable=subjec
import tkinter as tkfrom tkinter import filedialog messageboximport pandas as pdimport matplotlibpyplot as pltfrom matplotlibbackendsbackend_tkagg import FigureCanvasTkAggclass GradeManagementSystem

原文地址: https://www.cveoy.top/t/topic/hoS9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录