基于Python的学生成绩管理系统
学生成绩管理系统是一种用于管理学校学生成绩的软件系统,其中包括学生信息的录入、成绩的登记、查询、统计等功能。下面是一个基于Python的学生成绩管理系统的简单设计思路:
1. 数据库设计:使用MySQL数据库存储学生信息和成绩数据,至少包括以下表:
学生信息表:学生ID、姓名、性别、年龄、班级、联系方式等字段;
成绩表:课程名称、学生ID、成绩等字段。
2. 界面设计:使用Tkinter模块实现学生成绩管理系统的界面设计,至少包括以下界面:
登录界面:提供用户名和密码输入框,验证用户身份;
主界面:提供学生信息录入、成绩登记、查询、统计功能按钮;
学生信息录入界面:提供学生信息的输入框和确认按钮;
成绩登记界面:提供课程名称、学生ID、成绩输入框和确认按钮;
查询界面:提供查询条件输入框和查询按钮,查询结果显示在下方表格中;
统计界面:提供按照不同条件进行统计的选项,统计结果显示在下方表格中。
3. 功能实现:使用Python编写程序逻辑,实现学生信息录入、成绩登记、查询、统计等功能。
参考代码:
```python
import pymysql
import tkinter as tk
class StudentManagementSystem:
def __init__(self):
self.root = tk.Tk()
self.root.title("学生成绩管理系统")
# 登录界面
self.login_frame = tk.Frame(self.root)
self.username_label = tk.Label(self.login_frame, text='用户名:')
self.username_entry = tk.Entry(self.login_frame)
self.password_label = tk.Label(self.login_frame, text='密码:')
self.password_entry = tk.Entry(self.login_frame, show='*')
self.login_button = tk.Button(self.login_frame, text='登录', command=self.check_login)
self.username_label.pack(side=tk.LEFT)
self.username_entry.pack(side=tk.LEFT)
self.password_label.pack(side=tk.LEFT)
self.password_entry.pack(side=tk.LEFT)
self.login_button.pack(side=tk.LEFT)
self.login_frame.pack(side=tk.TOP, pady=10)
# 学生信息录入界面
self.add_student_frame = tk.Frame(self.root)
self.add_student_id_label = tk.Label(self.add_student_frame, text='学生ID:')
self.add_student_id_entry = tk.Entry(self.add_student_frame)
self.add_student_name_label = tk.Label(self.add_student_frame, text='姓名:')
self.add_student_name_entry = tk.Entry(self.add_student_frame)
self.add_student_gender_label = tk.Label(self.add_student_frame, text='性别:')
self.add_student_gender_entry = tk.Entry(self.add_student_frame)
self.add_student_age_label = tk.Label(self.add_student_frame, text='年龄:')
self.add_student_age_entry = tk.Entry(self.add_student_frame)
self.add_student_class_label = tk.Label(self.add_student_frame, text='班级:')
self.add_student_class_entry = tk.Entry(self.add_student_frame)
self.add_student_contact_label = tk.Label(self.add_student_frame, text='联系方式:')
self.add_student_contact_entry = tk.Entry(self.add_student_frame)
self.add_student_confirm_button = tk.Button(self.add_student_frame, text='确认', command=self.add_student_to_db)
self.add_student_id_label.pack(side=tk.LEFT)
self.add_student_id_entry.pack(side=tk.LEFT)
self.add_student_name_label.pack(side=tk.LEFT)
self.add_student_name_entry.pack(side=tk.LEFT)
self.add_student_gender_label.pack(side=tk.LEFT)
self.add_student_gender_entry.pack(side=tk.LEFT)
self.add_student_age_label.pack(side=tk.LEFT)
self.add_student_age_entry.pack(side=tk.LEFT)
self.add_student_class_label.pack(side=tk.LEFT)
self.add_student_class_entry.pack(side=tk.LEFT)
self.add_student_contact_label.pack(side=tk.LEFT)
self.add_student_contact_entry.pack(side=tk.LEFT)
self.add_student_confirm_button.pack(side=tk.LEFT)
# 成绩登记界面
self.add_score_frame = tk.Frame(self.root)
self.add_score_course_label = tk.Label(self.add_score_frame, text='课程名称:')
self.add_score_course_entry = tk.Entry(self.add_score_frame)
self.add_score_student_id_label = tk.Label(self.add_score_frame, text='学生ID:')
self.add_score_student_id_entry = tk.Entry(self.add_score_frame)
self.add_score_score_label = tk.Label(self.add_score_frame, text='成绩:')
self.add_score_score_entry = tk.Entry(self.add_score_frame)
self.add_score_confirm_button = tk.Button(self.add_score_frame, text='确认', command=self.add_score_to_db)
self.add_score_course_label.pack(side=tk.LEFT)
self.add_score_course_entry.pack(side=tk.LEFT)
self.add_score_student_id_label.pack(side=tk.LEFT)
self.add_score_student_id_entry.pack(side=tk.LEFT)
self.add_score_score_label.pack(side=tk.LEFT)
self.add_score_score_entry.pack(side=tk.LEFT)
self.add_score_confirm_button.pack(side=tk.LEFT)
# 查询界面
self.query_frame = tk.Frame(self.root)
self.query_course_label = tk.Label(self.query_frame, text='课程名称:')
self.query_course_entry = tk.Entry(self.query_frame)
self.query_student_id_label = tk.Label(self.query_frame, text='学生ID:')
self.query_student_id_entry = tk.Entry(self.query_frame)
self.query_button = tk.Button(self.query_frame, text='查询', command=self.query_db)
self.query_course_label.pack(side=tk.LEFT)
self.query_course_entry.pack(side=tk.LEFT)
self.query_student_id_label.pack(side=tk.LEFT)
self.query_student_id_entry.pack(side=tk.LEFT)
self.query_button.pack(side=tk.LEFT)
# 统计界面
self.stat_frame = tk.Frame(self.root)
self.stat_course_label = tk.Label(self.stat_frame, text='课程名称:')
self.stat_course_entry = tk.Entry(self.stat_frame)
self.stat_by_label = tk.Label(self.stat_frame, text='统计方式:')
self.stat_by_var = tk.StringVar(value='按班级统计')
self.stat_by_option = tk.OptionMenu(self.stat_frame, self.stat_by_var, '按班级统计', '按年龄统计', '按成绩排名')
self.stat_button = tk.Button(self.stat_frame, text='统计', command=self.statistic)
self.stat_course_label.pack(side=tk.LEFT)
self.stat_course_entry.pack(side=tk.LEFT)
self.stat_by_label.pack(side=tk.LEFT)
self.stat_by_option.pack(side=tk.LEFT)
self.stat_button.pack(side=tk.LEFT)
# 显示结果的表格
self.result_frame = tk.Frame(self.root)
self.result_table = tk.Text(self.result_frame, height=20, width=100)
self.result_table.pack()
self.result_frame.pack(side=tk.TOP)
self.db = pymysql.connect(host='localhost', user='root', password='', database='student')
self.cursor = self.db.cursor()
self.root.mainloop()
def check_login(self):
username = self.username_entry.get()
password = self.password_entry.get()
if username == 'admin' and password == '123456':
self.login_frame.pack_forget()
self.add_student_frame.pack(side=tk.TOP)
self.add_score_frame.pack(side=tk.TOP)
self.query_frame.pack(side=tk.TOP)
self.stat_frame.pack(side=tk.TOP)
else:
tk.messagebox.showwarning('登录失败', '用户名或密码错误!')
def add_student_to_db(self):
student_id = self.add_student_id_entry.get()
name = self.add_student_name_entry.get()
gender = self.add_student_gender_entry.get()
age = int(self.add_student_age_entry.get())
class_name = self.add_student_class_entry.get()
contact = self.add_student_contact_entry.get()
sql = "INSERT INTO student_info VALUES ('{}', '{}', '{}', {}, '{}', '{}')".format(student_id, name, gender, age, class_name, contact)
try:
self.cursor.execute(sql)
self.db.commit()
tk.messagebox.showinfo('学生信息录入', '学生信息已成功录入!')
except:
self.db.rollback()
tk.messagebox.showerror('学生信息录入', '学生信息录入失败!')
def add_score_to_db(self):
course = self.add_score_course_entry.get()
student_id = self.add_score_student_id_entry.get()
score = int(self.add_score_score_entry.get())
sql = "INSERT INTO student_score VALUES ('{}', '{}', {})".format(course, student_id, score)
try:
self.cursor.execute(sql)
self.db.commit()
tk.messagebox.showinfo('成绩录入', '成绩已成功录入!')
except:
self.db.rollback()
tk.messagebox.showerror('成绩录入', '成绩录入失败!')
def query_db(self):
course = self.query_course_entry.get()
student_id = self.query_student_id_entry.get()
if not course and not student_id:
sql = "SELECT student_info.student_id, student_info.name, student_info.class, AVG(student_score.score) FROM student_info LEFT JOIN student_score ON student_info.student_id=student_score.student_id GROUP BY student_info.student_id"
elif course and not student_id:
sql = "SELECT student_info.student_id, student_info.name, student_info.class, student_score.score FROM student_info INNER JOIN student_score ON student_info.student_id=student_score.student_id WHERE student_score.course='{}'".format(course)
elif not course and student_id:
sql = "SELECT student_info.student_id, student_info.name, student_info.class, student_score.score FROM student_info INNER JOIN student_score ON student_info.student_id=student_score.student_id WHERE student_info.student_id='{}'".format(student_id)
else:
sql = "SELECT student_info.student_id, student_info.name, student_info.class, student_score.score FROM student_info INNER JOIN student_score ON student_info.student_id=student_score.student_id WHERE student_info.student_id='{}' AND student_score.course='{}'".format(student_id, course)
self.cursor.execute(sql)
result = self.cursor.fetchall()
if result:
self.result_table.delete(1.0, tk.END)
headers = ['学生ID', '姓名', '班级', '成绩']
self.result_table.insert(tk.END, '{}\n'.format('\t'.join(headers)))
for row in result:
self.result_table.insert(tk.END, '{}\n'.format('\t'.join(str(col) for col in row)))
else:
tk.messagebox.showwarning('查询结果', '没有找到相关数据!')
def statistic(self):
course = self.stat_course_entry.get()
stat_by = self.stat_by_var.get()
if not course:
tk.messagebox.showwarning('统计结果', '请输入课程名称!')
return
if stat_by == '按班级统计':
sql = "SELECT student_info.class, MAX(student_score.score), AVG(student_score.score), MIN(student_score.score) FROM student_info LEFT JOIN student_score ON student_info.student_id=student_score.student_id WHERE student_score.course='{}' GROUP BY student_info.class".format(course)
elif stat_by == '按年龄统计':
sql = "SELECT FLOOR(student_info.age/10)*10 as age_range, COUNT(student_info.student_id), MAX(student_score.score), AVG(student_score.score), MIN(student_score.score) FROM student_info LEFT JOIN student_score ON student_info.student_id=student_score.student_id WHERE student_score.course='{}' GROUP BY age_range".format(course)
elif stat_by == '按成绩排名':
sql = "SELECT student_info.student_id, student_info.name, student_info.class, student_score.score FROM student_info INNER JOIN student_score ON student_info.student_id=student_score.student_id WHERE student_score.course='{}' ORDER BY student_score.score DESC LIMIT 10".format(course)
self.cursor.execute(sql)
result = self.cursor.fetchall()
if result:
self.result_table.delete(1.0, tk.END)
headers = ['班级/年龄段/学生ID', '最高分', '平均分', '最低分']
if stat_by == '按成绩排名':
headers = ['学生ID', '姓名', '班级', '成绩']
self.result_table.insert(tk.END, '{}\n'.format('\t'.join(headers)))
for row in result:
self.result_table.insert(tk.END, '{}\n'.format('\t'.join(str(col) for col in row)))
else:
tk.messagebox.showwarning('统计结果', '没有找到相关数据!')
StudentManagementSystem()
```
上述代码实现了一个基于Python和MySQL的学生成绩管理系统,可以完成学生信息录入、成绩登记、查询、统计等功能。