设计一个程序,用于管理学生成绩信息,包含添加、编辑和查看学生信息的功能。使用sqlite数据库存储学生成绩信息,tkinter模块实现GUI界面。其中,学生信息包括学号、姓名和班级等基本信息;成绩信息包括课程名称、分数、排名等。可以通过界面输入学生成绩信息并保存到数据库中。可以查看所有已存储的学生成绩信息,并支持根据学号或姓名查询某个学生成绩进行编辑。同时,需要处理并提示用户可能出现的错误,例如重复的学生学号或非法的输入格式等。最后,在主窗口中加入统计每科成绩的均值、方差和及格率等功能,并在输出学生成绩信息时显示每个班级学生成绩的数量及及格率。
时间: 2024-03-04 21:50:10 浏览: 64
好的,这是一个比较复杂的项目,需要用到sqlite数据库和tkinter模块,以下是一些代码示例和实现思路。
## 数据库设计
首先,我们需要设计一个合适的数据库结构来存储学生成绩信息。我们可以设计两个表:一个是学生信息表,另一个是成绩信息表。其中,学生信息表包含学号、姓名和班级等基本信息;成绩信息表包含课程名称、分数、排名等。两个表之间可以通过学号进行关联,具体的数据库表结构如下:
### 学生信息表(students)
| 列名 | 类型 | 描述 |
| --- | --- | --- |
| id | INTEGER | 学号,主键 |
| name | TEXT | 姓名 |
| class | TEXT | 班级 |
### 成绩信息表(scores)
| 列名 | 类型 | 描述 |
| --- | --- | --- |
| id | INTEGER | 成绩ID,主键 |
| student_id | INTEGER | 学号,外键,关联学生信息表的id列 |
| course | TEXT | 课程名称 |
| score | REAL | 分数 |
| rank | INTEGER | 排名 |
## GUI界面设计
我们使用tkinter模块来实现GUI界面。主窗口包含添加、编辑和查看学生信息的功能,以及统计每科成绩的均值、方差和及格率等功能。具体的界面设计如下:
![学生成绩管理系统](https://img-blog.csdnimg.cn/20220216111040291.png)
## 代码实现
### 连接数据库
我们首先需要连接sqlite数据库,可以使用Python内置的sqlite3模块来完成。以下是连接数据库的代码示例:
```python
import sqlite3
# 连接数据库
conn = sqlite3.connect('students.db')
cursor = conn.cursor()
```
### 创建数据库表
我们需要在数据库中创建学生信息表和成绩信息表。可以使用以下的代码示例来创建表:
```python
# 创建学生信息表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY,
name TEXT,
class TEXT
)
''')
# 创建成绩信息表
cursor.execute('''
CREATE TABLE IF NOT EXISTS scores (
id INTEGER PRIMARY KEY,
student_id INTEGER,
course TEXT,
score REAL,
rank INTEGER,
FOREIGN KEY(student_id) REFERENCES students(id)
)
''')
```
### 添加学生信息
我们需要在GUI界面中添加学生信息,当用户点击“添加”按钮时,将表单中的数据保存到数据库中。以下是添加学生信息的代码示例:
```python
def add_student():
# 获取表单数据
id = int(id_entry.get())
name = name_entry.get()
class_ = class_entry.get()
# 检查学号是否已经存在
cursor.execute('SELECT * FROM students WHERE id = ?', (id,))
if cursor.fetchone() is not None:
messagebox.showerror("错误", "学号已经存在,请重新输入!")
return
# 将学生信息保存到数据库
cursor.execute('INSERT INTO students(id, name, class) VALUES (?, ?, ?)', (id, name, class_))
conn.commit()
messagebox.showinfo("提示", "添加成功!")
```
### 编辑学生信息
我们需要在GUI界面中编辑学生信息,当用户点击“编辑”按钮时,根据学号或姓名查询到对应的学生信息,并将表单中的数据更新到数据库中。以下是编辑学生信息的代码示例:
```python
def edit_student():
# 获取表单数据
id = int(id_entry.get())
name = name_entry.get()
class_ = class_entry.get()
# 检查学号是否已经存在
cursor.execute('SELECT * FROM students WHERE id = ?', (id,))
if cursor.fetchone() is None:
messagebox.showerror("错误", "学号不存在,请重新输入!")
return
# 更新学生信息到数据库
cursor.execute('UPDATE students SET name = ?, class = ? WHERE id = ?', (name, class_, id))
conn.commit()
messagebox.showinfo("提示", "更新成功!")
```
### 查询学生信息
我们需要在GUI界面中查询学生信息,当用户点击“查询”按钮时,根据学号或姓名查询到对应的学生信息,并将查询结果显示在表格中。以下是查询学生信息的代码示例:
```python
def search_student():
# 获取查询关键字
keyword = keyword_entry.get()
# 根据学号或姓名查询学生信息
cursor.execute('SELECT * FROM students WHERE id = ? OR name LIKE ?', (keyword, '%' + keyword + '%'))
rows = cursor.fetchall()
# 显示查询结果
result_tree.delete(*result_tree.get_children())
for row in rows:
result_tree.insert('', 'end', values=row)
```
### 添加成绩信息
我们需要在GUI界面中添加成绩信息,当用户点击“添加”按钮时,将表单中的数据保存到数据库中。以下是添加成绩信息的代码示例:
```python
def add_score():
# 获取表单数据
student_id = int(student_id_entry.get())
course = course_entry.get()
score = float(score_entry.get())
# 将成绩信息保存到数据库
cursor.execute('SELECT count(*) FROM scores WHERE student_id = ? AND course = ?', (student_id, course))
count = cursor.fetchone()[0]
if count > 0:
messagebox.showerror("错误", "该学生该课程成绩已存在,请勿重复添加!")
return
cursor.execute('INSERT INTO scores(student_id, course, score) VALUES (?, ?, ?)', (student_id, course, score))
conn.commit()
messagebox.showinfo("提示", "添加成功!")
```
### 统计成绩信息
我们需要在GUI界面中统计每科成绩的均值、方差和及格率等信息。以下是统计成绩信息的代码示例:
```python
def calculate_statistics():
# 统计每个班级的学生数量和及格率
cursor.execute('''
SELECT class, COUNT(*), AVG(score), VAR_POP(score), SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*)
FROM students JOIN scores ON students.id = scores.student_id
GROUP BY class
''')
rows = cursor.fetchall()
# 显示统计结果
statistics_text.delete('1.0', 'end')
statistics_text.insert('1.0', '班级\t学生数量\t平均分\t方差\t及格率\n')
for row in rows:
statistics_text.insert('end', '\t'.join(map(str, row)) + '\n')
```
## 完整代码
最后,我们将上面的代码示例整合成一个完整的程序。完整代码如下:
阅读全文