设计一个程序,用于管理学生成绩信息,包含添加、编辑和查看学生信息的功能。使用sqlite数据库存储学生成绩信息,tkinter模块实现GUI界面。其中,学生信息包括学号、姓名和班级等基本信息;成绩信息包括课程名称、分数、排名等。可以通过界面输入学生成绩信息并保存到数据库中。可以查看所有已存储的学生成绩信息,并支持根据学号或姓名查询某个学生成绩进行编辑。同时,需要处理并提示用户可能出现的错误,例如重复的学生学号或非法的输入格式等。最后,在主窗口中加入统计每科成绩的均值、方差和及格率等功能,并在输出学生成绩信息时显示每个班级学生成绩的数量及及格率。
时间: 2024-03-04 22:49:36 浏览: 77
好的,我理解了您的问题。以下是我的回答:
首先,需要安装并导入sqlite3和tkinter模块。使用sqlite3模块创建一个数据库和表来存储学生成绩信息。表包括学号、姓名、班级、课程名称、分数和排名等字段。使用tkinter模块创建GUI界面,包括添加、编辑和查看学生信息的功能。
在添加学生信息时,需要检查学生学号是否已经存在,并对输入进行格式验证,例如保证学号为数字。在编辑学生信息时,可以通过学号或姓名查询到该学生的信息,然后进行修改。
在显示学生成绩信息时,需要计算每个班级的学生成绩均值、方差和及格率等统计信息,并在输出学生成绩信息时显示。同时,需要对可能出现的错误进行处理和提示,例如重复的学生学号或非法的输入格式等。
下面是一份示例代码,您可以参考它进行开发:
```python
import sqlite3
import tkinter as tk
from tkinter import messagebox
class StudentGradeManager:
def __init__(self):
# 连接数据库并创建表
self.conn = sqlite3.connect('student_grade.db')
self.cur = self.conn.cursor()
self.cur.execute('CREATE TABLE IF NOT EXISTS student_grade (id INTEGER PRIMARY KEY, num INTEGER, name TEXT, class TEXT, course TEXT, score INTEGER, rank INTEGER)')
self.conn.commit()
self.root = tk.Tk()
self.root.title('学生成绩管理系统')
self.create_widgets()
self.root.mainloop()
def create_widgets(self):
# 添加学生信息部分
add_frame = tk.Frame(self.root)
add_frame.pack(side=tk.TOP, pady=10)
tk.Label(add_frame, text='学号:').grid(row=0, column=0)
self.add_num_entry = tk.Entry(add_frame)
self.add_num_entry.grid(row=0, column=1)
tk.Label(add_frame, text='姓名:').grid(row=1, column=0)
self.add_name_entry = tk.Entry(add_frame)
self.add_name_entry.grid(row=1, column=1)
tk.Label(add_frame, text='班级:').grid(row=2, column=0)
self.add_class_entry = tk.Entry(add_frame)
self.add_class_entry.grid(row=2, column=1)
tk.Label(add_frame, text='课程名称:').grid(row=3, column=0)
self.add_course_entry = tk.Entry(add_frame)
self.add_course_entry.grid(row=3, column=1)
tk.Label(add_frame, text='分数:').grid(row=4, column=0)
self.add_score_entry = tk.Entry(add_frame)
self.add_score_entry.grid(row=4, column=1)
tk.Button(add_frame, text='添加', command=self.add_student).grid(row=5, column=1)
# 编辑学生信息部分
edit_frame = tk.Frame(self.root)
edit_frame.pack(side=tk.TOP, pady=10)
tk.Label(edit_frame, text='学号/姓名:').grid(row=0, column=0)
self.edit_entry = tk.Entry(edit_frame)
self.edit_entry.grid(row=0, column=1)
tk.Button(edit_frame, text='查询', command=self.edit_student).grid(row=0, column=2)
# 显示学生成绩信息部分
show_frame = tk.Frame(self.root)
show_frame.pack(side=tk.TOP, pady=10)
tk.Label(show_frame, text='学生信息列表').grid(row=0, column=0)
self.show_text = tk.Text(show_frame, width=80, height=10)
self.show_text.grid(row=1, column=0)
tk.Button(show_frame, text='刷新', command=self.show_student).grid(row=2, column=0)
# 统计信息部分
stat_frame = tk.Frame(self.root)
stat_frame.pack(side=tk.TOP, pady=10)
tk.Label(stat_frame, text='统计信息').grid(row=0, column=0)
self.stat_text = tk.Text(stat_frame, width=80, height=5)
self.stat_text.grid(row=1, column=0)
tk.Button(stat_frame, text='刷新', command=self.show_stat).grid(row=2, column=0)
def add_student(self):
num = self.add_num_entry.get()
name = self.add_name_entry.get()
class_ = self.add_class_entry.get()
course = self.add_course_entry.get()
score = self.add_score_entry.get()
# 检查输入格式
if not num.isdigit() or not score.isdigit():
messagebox.showerror('错误', '学号和分数必须为数字')
return
# 检查学号是否已经存在
self.cur.execute('SELECT * FROM student_grade WHERE num=?', (num,))
if self.cur.fetchone():
messagebox.showerror('错误', '学号已经存在')
return
# 插入学生信息
self.cur.execute('INSERT INTO student_grade (num, name, class, course, score, rank) VALUES (?, ?, ?, ?, ?, 0)', (num, name, class_, course, score))
self.conn.commit()
messagebox.showinfo('提示', '学生信息添加成功')
self.add_num_entry.delete(0, tk.END)
self.add_name_entry.delete(0, tk.END)
self.add_class_entry.delete(0, tk.END)
self.add_course_entry.delete(0, tk.END)
self.add_score_entry.delete(0, tk.END)
def edit_student(self):
keyword = self.edit_entry.get()
if not keyword:
messagebox.showerror('错误', '请输入学号或姓名')
return
# 查询学生信息
self.cur.execute('SELECT * FROM student_grade WHERE num=? OR name=?', (keyword, keyword))
student = self.cur.fetchone()
if not student:
messagebox.showerror('错误', '学生信息不存在')
return
# 显示学生信息
self.add_num_entry.delete(0, tk.END)
self.add_num_entry.insert(0, student[1])
self.add_name_entry.delete(0, tk.END)
self.add_name_entry.insert(0, student[2])
self.add_class_entry.delete(0, tk.END)
self.add_class_entry.insert(0, student[3])
self.add_course_entry.delete(0, tk.END)
self.add_course_entry.insert(0, student[4])
self.add_score_entry.delete(0, tk.END)
self.add_score_entry.insert(0, student[5])
def show_student(self):
# 显示学生成绩信息
self.cur.execute('SELECT * FROM student_grade')
students = self.cur.fetchall()
self.show_text.delete(1.0, tk.END)
for student in students:
self.show_text.insert(tk.END, '学号:{}\n姓名:{}\n班级:{}\n课程名称:{}\n分数:{}\n排名:{}\n\n'.format(student[1], student[2], student[3], student[4], student[5], student[6]))
def show_stat(self):
# 统计信息
self.cur.execute('SELECT class, AVG(score), VAR_POP(score), AVG(CASE WHEN score>=60 THEN 1 ELSE 0 END) FROM student_grade GROUP BY class')
stats = self.cur.fetchall()
self.stat_text.delete(1.0, tk.END)
for stat in stats:
self.stat_text.insert(tk.END, '班级:{}\n平均分:{}\n方差:{}\n及格率:{}\n\n'.format(stat[0], stat[1], stat[2], stat[3]))
def __del__(self):
# 关闭数据库连接
self.cur.close()
self.conn.close()
if __name__ == '__main__':
manager = StudentGradeManager()
```
注意,上述代码仅供参考,您需要根据具体需求进行修改和完善。
阅读全文