使用Python和SQLite构建软考评估系统

2024-06-10 14:33:45 浏览数 (2)

在计算机科学教育领域,评估自己的知识水平至关重要。无论是学生提升技能还是专业人士保持与最新趋势同步,拥有一个强大的系统来评估和增强知识都是非常重要的。在本文中,我们将深入探讨如何使用Python和SQLite构建计算机科学知识评估系统。

系统简介

我们构建的计算机科学知识评估系统有两个主要目的:

  1. 数据提取和存储:首先,我们将从一个JSON文件中提取考试问题和答案,并将它们存储在一个SQLite数据库中。
  2. 用户界面和评估:我们将开发一个用户友好的界面,用户可以与存储的问题进行交互,回答这些问题,并获得有关他们表现的反馈。

数据提取和存储

我们从一个JSON文件(timu.json)中解析考试问题和答案,并将它们存储在一个SQLite数据库(.db)中。这个过程的详细步骤如下:

  • JSON解析:使用Python的json模块,我们将包含考试数据的JSON文件读取到一个Python字典中。
  • SQLite数据库创建:我们建立与SQLite数据库的连接,并创建一个名为exam的表,用于存储考试问题、答案选项和正确答案。
  • 数据插入:我们遍历提取的数据,将每个问题以及其答案选项和正确答案插入到SQLite数据库中。
代码语言: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()

用户界面和评估

用户界面使用Tkinter库开发,提供了一个简单直观的平台,用户可以与之交互。关键功能包括:

  • 显示问题:问题按顺序显示,同时显示相应的答案选项,以单选按钮形式呈现。
  • 提交答案:用户选择他们的答案并提交。
  • 反馈机制:提交后,用户会立即收到反馈,指示他们的答案是否正确或不正确,以及他们当前的得分。
  • 模式切换:用户可以在“复习模式”(正确答案预先选择)和“测试模式”(用户必须选择答案)之间切换。
代码语言:python代码运行次数:0复制
# 界面
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()

0 人点赞