前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python和SQLite构建软考评估系统

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

原创
作者头像
菜菜有点菜
修改2024-06-10 14:33:45
1360
修改2024-06-10 14:33:45
举报
文章被收录于专栏:白菜博客

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系统简介
  • 数据提取和存储
  • 用户界面和评估
  • 效果
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档