在计算机科学教育领域,评估自己的知识水平至关重要。无论是学生提升技能还是专业人士保持与最新趋势同步,拥有一个强大的系统来评估和增强知识都是非常重要的。在本文中,我们将深入探讨如何使用Python和SQLite构建计算机科学知识评估系统。
我们构建的计算机科学知识评估系统有两个主要目的:
我们从一个JSON文件(timu.json
)中解析考试问题和答案,并将它们存储在一个SQLite数据库(.db
)中。这个过程的详细步骤如下:
json
模块,我们将包含考试数据的JSON文件读取到一个Python字典中。exam
的表,用于存储考试问题、答案选项和正确答案。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()
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()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。