在计算机科学教育领域,评估自己的知识水平至关重要。无论是学生提升技能还是专业人士保持与最新趋势同步,拥有一个强大的系统来评估和增强知识都是非常重要的。在本文中,我们将深入探讨如何使用Python和SQLite构建计算机科学知识评估系统。
系统简介
我们构建的计算机科学知识评估系统有两个主要目的:
- 数据提取和存储:首先,我们将从一个JSON文件中提取考试问题和答案,并将它们存储在一个SQLite数据库中。
- 用户界面和评估:我们将开发一个用户友好的界面,用户可以与存储的问题进行交互,回答这些问题,并获得有关他们表现的反馈。
数据提取和存储
我们从一个JSON文件(timu.json
)中解析考试问题和答案,并将它们存储在一个SQLite数据库(.db
)中。这个过程的详细步骤如下:
- JSON解析:使用Python的
json
模块,我们将包含考试数据的JSON文件读取到一个Python字典中。 - SQLite数据库创建:我们建立与SQLite数据库的连接,并创建一个名为
exam
的表,用于存储考试问题、答案选项和正确答案。 - 数据插入:我们遍历提取的数据,将每个问题以及其答案选项和正确答案插入到SQLite数据库中。
import json
import sqlite3
flag = True
with open('timu.json', 'r', encoding='utf-8') as file:
data = json.load(file)
print(data)
# 创建 SQLite 连接和表
try:
conn = sqlite3.connect('.db')
cursor = conn.cursor()
# 创建 exam 表
cursor.execute('''
CREATE TABLE IF NOT EXISTS exam (
question TEXT,
Answer_A TEXT,
Answer_B TEXT,
Answer_C TEXT,
Answer_D TEXT,
right_Answer TEXT
)
''')
# 提取数据项
questions = data['data']['weChatDoExamQuestionVOs']
for question in questions:
content = question['content']
options = question['weChatDoExamAnswerVOs']
right_answer = next(option['content'][0] for option in options if option['yesOrNo'])
answer_a = options[0]['content']
answer_b = options[1]['content']
answer_c = options[2]['content']
answer_d = options[3]['content']
cursor.execute('''
INSERT INTO exam (question, Answer_A, Answer_B, Answer_C, Answer_D, right_Answer)
VALUES (?, ?, ?, ?, ?, ?)
''', (content, answer_a, answer_b, answer_c, answer_d, right_answer))
# 提交事务
conn.commit()
# 通过 rowcount 获得插入的行数
print('插入的行数:', cursor.rowcount)
except sqlite3.Error as e:
print(f"SQLite 错误: {e}")
finally:
# 关闭连接
cursor.close()
conn.close()
# 重新连接数据库,查询数据
try:
conn = sqlite3.connect('.db')
cursor = conn.cursor()
# 执行查询语句
cursor.execute('SELECT * FROM exam')
# 获得查询结果集
values = cursor.fetchall()
print(values)
print('记录数:', len(values))
for k in range(len(values)):
print(k, values[k][0])
except sqlite3.Error as e:
print(f"SQLite 错误: {e}")
finally:
# 关闭连接
cursor.close()
conn.close()
用户界面和评估
用户界面使用Tkinter库开发,提供了一个简单直观的平台,用户可以与之交互。关键功能包括:
- 显示问题:问题按顺序显示,同时显示相应的答案选项,以单选按钮形式呈现。
- 提交答案:用户选择他们的答案并提交。
- 反馈机制:提交后,用户会立即收到反馈,指示他们的答案是否正确或不正确,以及他们当前的得分。
- 模式切换:用户可以在“复习模式”(正确答案预先选择)和“测试模式”(用户必须选择答案)之间切换。
# 界面
import tkinter
from tkinter import *
from tkinter.messagebox import *
def callNext():
global k
global score
useranswer = r.get()
print(r.get()) # 获取被选中单选按钮变量值
if useranswer == values[k][5]:
showinfo(" 恭喜", " 恭喜你对了! 10粉")
score = 10
else:
showinfo(" 遗憾", " 遗憾你错了!-10粉")
score -= 10
k = k 1
if k >= len(values):
showinfo(" 提示", " 题目做完了!得分:{}".format(score))
return
# 显示下一题
timu["text"] = values[k][0]
radio1["text"] = values[k][1]
radio2["text"] = values[k][2]
radio3["text"] = values[k][3]
radio4["text"] = values[k][4]
if flag:
r.set(values[k][5]) # 背题模式
else:
r.set('=========') # 做题模式
# 模式切换
def switchModel():
global flag
flag = not flag # 切换 True 和 False
callNext()
print(f"当前模式: {'背题模式' if flag else '测试模式'}")
def callResult():
showinfo(" 你的得分", str(score))
root = tkinter.Tk()
root.title('计算机专业知识测评系统')
root.geometry("500x200")
r = tkinter.StringVar() # 创建 StringVar 对象
r.set('==============') # 设置初始值为 'E' ,初始没选中
k = 0
score = 0
timu = tkinter.Label(root, text=values[k][0]) # 题目
timu.pack()
f1 = Frame(root) # 创建第 1 个 Frame 组件
f1.pack()
radio1 = tkinter.Radiobutton(f1, variable=r, value='A', text=values[k][1])
radio1.pack()
radio2 = tkinter.Radiobutton(f1, variable=r, value='B', text=values[k][2])
radio2.pack()
radio3 = tkinter.Radiobutton(f1, variable=r, value='C', text=values[k][3])
radio3.pack()
radio4 = tkinter.Radiobutton(f1, variable=r, value='D', text=values[k][4])
radio4.pack()
f2 = Frame(root) # 创建第 2 个 Frame 组件
f2.pack()
Button(f2, text=' 切换模式[背题|答题] ', command=switchModel).pack(side=LEFT)
Button(f2, text=' 下一题 ', command=callNext).pack(side=LEFT)
Button(f2, text=' 结果 ', command=callResult).pack(side=LEFT)
root.mainloop()
效果
完整代码
代码语言:python代码运行次数:0复制import json
import sqlite3
flag = True
with open('timu.json', 'r', encoding='utf-8') as file:
data = json.load(file)
print(data)
# 创建 SQLite 连接和表
try:
conn = sqlite3.connect('.db')
cursor = conn.cursor()
# 创建 exam 表
cursor.execute('''
CREATE TABLE IF NOT EXISTS exam (
question TEXT,
Answer_A TEXT,
Answer_B TEXT,
Answer_C TEXT,
Answer_D TEXT,
right_Answer TEXT
)
''')
# 提取数据项
questions = data['data']['weChatDoExamQuestionVOs']
for question in questions:
content = question['content']
options = question['weChatDoExamAnswerVOs']
right_answer = next(option['content'][0] for option in options if option['yesOrNo'])
answer_a = options[0]['content']
answer_b = options[1]['content']
answer_c = options[2]['content']
answer_d = options[3]['content']
cursor.execute('''
INSERT INTO exam (question, Answer_A, Answer_B, Answer_C, Answer_D, right_Answer)
VALUES (?, ?, ?, ?, ?, ?)
''', (content, answer_a, answer_b, answer_c, answer_d, right_answer))
# 提交事务
conn.commit()
# 通过 rowcount 获得插入的行数
print('插入的行数:', cursor.rowcount)
except sqlite3.Error as e:
print(f"SQLite 错误: {e}")
finally:
# 关闭连接
cursor.close()
conn.close()
# 重新连接数据库,查询数据
try:
conn = sqlite3.connect('.db')
cursor = conn.cursor()
# 执行查询语句
cursor.execute('SELECT * FROM exam')
# 获得查询结果集
values = cursor.fetchall()
print(values)
print('记录数:', len(values))
for k in range(len(values)):
print(k, values[k][0])
except sqlite3.Error as e:
print(f"SQLite 错误: {e}")
finally:
# 关闭连接
cursor.close()
conn.close()
# 界面
import tkinter
from tkinter import *
from tkinter.messagebox import *
def callNext():
global k
global score
useranswer = r.get()
print(r.get()) # 获取被选中单选按钮变量值
if useranswer == values[k][5]:
showinfo(" 恭喜", " 恭喜你对了! 10粉")
score = 10
else:
showinfo(" 遗憾", " 遗憾你错了!-10粉")
score -= 10
k = k 1
if k >= len(values):
showinfo(" 提示", " 题目做完了!得分:{}".format(score))
return
# 显示下一题
timu["text"] = values[k][0]
radio1["text"] = values[k][1]
radio2["text"] = values[k][2]
radio3["text"] = values[k][3]
radio4["text"] = values[k][4]
if flag:
r.set(values[k][5]) # 背题模式
else:
r.set('=========') # 做题模式
# 模式切换
def switchModel():
global flag
flag = not flag # 切换 True 和 False
callNext()
print(f"当前模式: {'背题模式' if flag else '测试模式'}")
def callResult():
showinfo(" 你的得分", str(score))
root = tkinter.Tk()
root.title('计算机专业知识测评系统')
root.geometry("500x200")
r = tkinter.StringVar() # 创建 StringVar 对象
r.set('==============') # 设置初始值为 'E' ,初始没选中
k = 0
score = 0
timu = tkinter.Label(root, text=values[k][0]) # 题目
timu.pack()
f1 = Frame(root) # 创建第 1 个 Frame 组件
f1.pack()
radio1 = tkinter.Radiobutton(f1, variable=r, value='A', text=values[k][1])
radio1.pack()
radio2 = tkinter.Radiobutton(f1, variable=r, value='B', text=values[k][2])
radio2.pack()
radio3 = tkinter.Radiobutton(f1, variable=r, value='C', text=values[k][3])
radio3.pack()
radio4 = tkinter.Radiobutton(f1, variable=r, value='D', text=values[k][4])
radio4.pack()
f2 = Frame(root) # 创建第 2 个 Frame 组件
f2.pack()
Button(f2, text=' 切换模式[背题|答题] ', command=switchModel).pack(side=LEFT)
Button(f2, text=' 下一题 ', command=callNext).pack(side=LEFT)
Button(f2, text=' 结果 ', command=callResult).pack(side=LEFT)
root.mainloop()