前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 模拟在线考试

python 模拟在线考试

作者头像
叶子陪你玩
发布2021-08-23 15:10:03
3K0
发布2021-08-23 15:10:03
举报

今天放上之前的python有趣的案例集中的模拟在线考试代码,有些功能还没有完善,愿意修改的同学可以自己拿源代码修改。

运行效果视频:

questions.json 文件代码

模拟题库,可以自己手动往里添加题目,也可以导入题库(这个内容在之后的随机出试卷的案例中会讲解),这里直接使用现成的题库文件,里面的问题有些是重复的,仅仅做测试使用。

代码语言:javascript
复制
{
  "choice": [
    {
      "title": "下列哪个语句在Python中是非法的?",
      "A": "x = y = z = 1",
      "B": "x = (y = z + 1)",
      "C": "x, y = y, x",
      "D": "x  +=  y",
      "answer": "B"
    },
    {
      "title": "下面哪个不是Python合法的标识符?",
      "A": "int32",
      "B": "40XL",
      "C": "self",
      "D": "__name__",
      "answer": "B"
    },
    {
      "title": "下列哪个语句在Python中是非法的?",
      "A": "x = y = z = 1",
      "B": "x = (y = z + 1)",
      "C": "x, y = y, x",
      "D": "x  +=  y",
      "answer": "B"
    },
    {
      "title": "下面哪个不是Python合法的标识符?",
      "A": "int32",
      "B": "40XL",
      "C": "self",
      "D": "__name__",
      "answer": "B"
    },
    {
      "title": "下列哪个语句在Python中是非法的?",
      "A": "x = y = z = 1",
      "B": "x = (y = z + 1)",
      "C": "x, y = y, x",
      "D": "x  +=  y",
      "answer": "B"
    },
    {
      "title": "下面哪个不是Python合法的标识符?",
      "A": "int32",
      "B": "40XL",
      "C": "self",
      "D": "__name__",
      "answer": "B"
    },
    {
      "title": "下列哪个语句在Python中是非法的?",
      "A": "x = y = z = 1",
      "B": "x = (y = z + 1)",
      "C": "x, y = y, x",
      "D": "x  +=  y",
      "answer": "B"
    },
    {
      "title": "下面哪个不是Python合法的标识符?",
      "A": "int32",
      "B": "40XL",
      "C": "self",
      "D": "__name__",
      "answer": "B"
    }
  ],
  "judge": [
    {
      "title": "当作为条件表达式时,[]与None等价。",
      "A": "是",
      "B": "否",
      "answer": "A"
    },
    {
      "title": "当作为条件表达式时,0 与 False 等价。",
      "A": "是",
      "B": "否",
      "answer": "A"
    },
    {
      "title": "当作为条件表达式时,[]与None等价。",
      "A": "是",
      "B": "否",
      "answer": "A"
    },
    {
      "title": "当作为条件表达式时,0 与 False 等价。",
      "A": "是",
      "B": "否",
      "answer": "A"
    },
    {
      "title": "当作为条件表达式时,[]与None等价。",
      "A": "是",
      "B": "否",
      "answer": "A"
    },
    {
      "title": "当作为条件表达式时,0 与 False 等价。",
      "A": "是",
      "B": "否",
      "answer": "A"
    }
  ]
}

ui_test.py 文件

该文件是界面的代码,由设计界面图转化过来的,导入到主代码使用即可。

代码语言:javascript
复制
from PySide2 import QtCore, QtGui, QtWidgets

class Ui_Test(object):
    def setupUi(self, Test):
        Test.setObjectName("Test")
        Test.resize(795, 546)
        self.centralwidget = QtWidgets.QWidget(Test)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 200, 691, 41))
        self.label.setObjectName("label")
        self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton.setGeometry(QtCore.QRect(50, 250, 651, 31))
        self.radioButton.setObjectName("radioButton")
        self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_2.setGeometry(QtCore.QRect(50, 290, 631, 31))
        self.radioButton_2.setObjectName("radioButton_2")
        self.radioButton_3 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_3.setGeometry(QtCore.QRect(50, 330, 611, 31))
        self.radioButton_3.setObjectName("radioButton_3")
        self.radioButton_4 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_4.setGeometry(QtCore.QRect(50, 370, 631, 31))
        self.radioButton_4.setObjectName("radioButton_4")
        self.answer = QtWidgets.QPushButton(self.centralwidget)
        self.answer.setGeometry(QtCore.QRect(80, 440, 101, 41))
        self.answer.setObjectName("answer")
        self.pre = QtWidgets.QPushButton(self.centralwidget)
        self.pre.setGeometry(QtCore.QRect(300, 440, 111, 41))
        self.pre.setObjectName("pre")
        self.next = QtWidgets.QPushButton(self.centralwidget)
        self.next.setGeometry(QtCore.QRect(500, 440, 111, 41))
        self.next.setObjectName("next")
        self.hand_in = QtWidgets.QPushButton(self.centralwidget)
        self.hand_in.setGeometry(QtCore.QRect(650, 130, 91, 41))
        self.hand_in.setObjectName("hand_in")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(300, 30, 421, 71))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.label_2.setFont(font)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(30, 180, 711, 20))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.line_2 = QtWidgets.QFrame(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(30, 410, 711, 20))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setGeometry(QtCore.QRect(10, 40, 271, 141))
        self.groupBox_2.setObjectName("groupBox_2")
        self.lb_account = QtWidgets.QLabel(self.groupBox_2)
        self.lb_account.setGeometry(QtCore.QRect(20, 20, 241, 51))
        self.lb_account.setObjectName("lb_account")
        self.lb_name = QtWidgets.QLabel(self.groupBox_2)
        self.lb_name.setGeometry(QtCore.QRect(20, 50, 231, 51))
        self.lb_name.setObjectName("lb_name")
        self.label_7 = QtWidgets.QLabel(self.groupBox_2)
        self.label_7.setGeometry(QtCore.QRect(20, 80, 231, 61))
        self.label_7.setObjectName("label_7")
        self.pbtn_start = QtWidgets.QPushButton(self.centralwidget)
        self.pbtn_start.setGeometry(QtCore.QRect(300, 130, 91, 41))
        self.pbtn_start.setObjectName("pbtn_start")
        self.lb_time = QtWidgets.QLabel(self.centralwidget)
        self.lb_time.setGeometry(QtCore.QRect(420, 130, 191, 41))
        self.lb_time.setAlignment(QtCore.Qt.AlignCenter)
        self.lb_time.setObjectName("lb_time")
        Test.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(Test)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 795, 22))
        self.menubar.setObjectName("menubar")
        Test.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(Test)
        self.statusbar.setObjectName("statusbar")
        Test.setStatusBar(self.statusbar)

        self.retranslateUi(Test)
        QtCore.QMetaObject.connectSlotsByName(Test)

    def retranslateUi(self, Test):
        Test.setWindowTitle(QtWidgets.QApplication.translate("Test", "python在线测试", None, -1))
        self.label.setText(QtWidgets.QApplication.translate("Test", "1.xxxx", None, -1))
        self.radioButton.setText(QtWidgets.QApplication.translate("Test", "A.xx", None, -1))
        self.radioButton_2.setText(QtWidgets.QApplication.translate("Test", "B.xx", None, -1))
        self.radioButton_3.setText(QtWidgets.QApplication.translate("Test", "C.xx", None, -1))
        self.radioButton_4.setText(QtWidgets.QApplication.translate("Test", "D.xx", None, -1))
        self.answer.setText(QtWidgets.QApplication.translate("Test", "提交答案", None, -1))
        self.pre.setText(QtWidgets.QApplication.translate("Test", "《上一题", None, -1))
        self.next.setText(QtWidgets.QApplication.translate("Test", "下一题》", None, -1))
        self.hand_in.setText(QtWidgets.QApplication.translate("Test", "交卷", None, -1))
        self.label_2.setText(QtWidgets.QApplication.translate("Test", "Python 在线考试", None, -1))
        self.groupBox_2.setTitle(QtWidgets.QApplication.translate("Test", "学生信息", None, -1))
        self.lb_account.setText(QtWidgets.QApplication.translate("Test", "账号:1201201414", None, -1))
        self.lb_name.setText(QtWidgets.QApplication.translate("Test", "姓名:yeching", None, -1))
        self.label_7.setText(QtWidgets.QApplication.translate("Test", "时间:90分钟", None, -1))
        self.pbtn_start.setText(QtWidgets.QApplication.translate("Test", "开始", None, -1))
        self.lb_time.setText(QtWidgets.QApplication.translate("Test", "剩余时间:90:00", None, -1))

main.py 主程序文件

主程序文件代码,如果做课的话或者拆分子任务的话,可以拆成很多小任务实现,比如拆分为两节课可以这样写:

课程(上)

  • 任务-1 界面设计
  • 任务-2 界面初始化
  • 任务-3 开始考试
  • 任务-4 时间变化

课程(下)

  • 任务-1 提交答案
  • 任务-2 题目切换
  • 任务-3 提交试卷
  • 任务-4 记录测试结果
  • 任务-5 自动退出
代码语言:javascript
复制
import sys
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from ui_test import Ui_Test
import random
import json

class Test(QMainWindow, Ui_Test):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # 读取题库题目
        with open('questions.json','r',encoding='utf-8') as f:
            self.questions = json.load(f)

        self.setup()
        #显示主窗体
        self.show()

        self.pre.clicked.connect(self._pre)
        self.next.clicked.connect(self._next)
        self.answer.clicked.connect(self.hand_in_answer)
        self.select_answer = {}
        self.pbtn_start.clicked.connect(self.start_test)
        self.hand_in.clicked.connect(self.hand_in_paper)

    def setup(self):
        account = QInputDialog.getText(None,'输入账号','请输入你的账号')[0]
        self.lb_account.setText('账号:'+ account)
        name = QInputDialog.getText(None,'输入名字','请输入你的名字')[0]
        self.lb_name.setText('姓名:'+ name)
        self.radio_list = [self.radioButton, self.radioButton_2, self.radioButton_3, self.radioButton_4]
        self.fun_list = ['A', 'B', 'C', 'D']
        self.current = None
        self.index = 0
        all_choice_list = self.questions['choice']
        all_judge_list = self.questions['judge']
        choice_num = 5
        judge_num = 5
        self.choice_list = random.sample(all_choice_list, k=choice_num)
        self.judge_list = random.sample(all_judge_list, k=judge_num)
        self.current = self.choice_list[self.index]
        self.set_button_enabled()
        # 初始化一个定时器
        self.timer = QTimer()
        # 定时器结束,触发start_timer方法
        self.timer.timeout.connect(self.start_timer)
        self.all_seconds = 90 * 60

    def set_button_enabled(self,c = False):
        self.hand_in.setEnabled(c)
        self.answer.setEnabled(c)
        self.pre.setEnabled(c)
        self.next.setEnabled(c)

    def start_timer(self):
        self.all_seconds = self.all_seconds - 1
        rest_m = self.all_seconds // 60
        rest_s = self.all_seconds % 60
        self.lb_time.setText('剩余时间:'+str(rest_m)+":"+str(rest_s))


    def start_test(self):
        self.set_button_enabled(c=True)
        self.display()
        # 启动定时器,时间间隔1s,1s后会再次启动
        self.timer.start(1000)

    def _pre(self):
        if self.index > 0:
            self.index -= 1
        else:
            QMessageBox.information(self, "提示信息", "这已经是第一题了", QMessageBox.Yes | QMessageBox.No,
                                    QMessageBox.Yes)
        self.current = self.choice_list[self.index]
        self.display()

    def _next(self):
        if self.index <len(self.choice_list)-1:
            self.index += 1
        else:
            QMessageBox.information(self, "提示信息", "这已经是最后一题了", QMessageBox.Yes | QMessageBox.No,
                                    QMessageBox.Yes)
        self.current = self.choice_list[self.index]
        self.display()

    def display(self):
        self.label.setText(str(self.index+1)+". "+self.current['title'])
        self.radioButton.setText('A.'+self.current['A'])
        self.radioButton_2.setText('B.'+self.current['B'])
        self.radioButton_3.setText('C.'+self.current['C'])
        self.radioButton_4.setText('D.'+self.current['D'])

    def hand_in_answer(self):
        for (I, J) in zip(self.radio_list,self.fun_list):
                self.select_answer[self.index]=J
        print(self.select_answer)

    def hand_in_paper(self):
        if len(self.select_answer.keys())==len(self.choice_list):
            self.timer.stop()
            result = '你的答题结果如下:\n'
            score = 0
            for i in range(len(self.choice_list)):
                if self.choice_list[i]['answer'] == self.select_answer[i]:
                    result += f"第{i+1}题正确\n"
                    score = score + 10
                else:
                    result += f"第{i+1}题错误,你选的{self.choice_list[i]['answer']},正确的答案为{self.select_answer[i]}\n"
            tip = f"满分100分,你的得分为{score}分"
            QMessageBox.information(self, "提示信息", result+tip , QMessageBox.Yes | QMessageBox.No,
                                    QMessageBox.Yes)
            # 提示自动退出
            infoBox = QMessageBox()
            infoBox.setIcon(QMessageBox.Information)
            infoBox.setText("您已交卷,3s后自动退出")
            infoBox.setWindowTitle("退出提示")
            infoBox.setStandardButtons(QMessageBox.Ok)
            infoBox.button(QMessageBox.Ok).animateClick(3 * 1000)  # 3秒自动关闭
            infoBox.exec_()
            sys.exit()
        else:
            QMessageBox.information(self, "提示信息", "你还有题目未做完", QMessageBox.Yes | QMessageBox.No,
                                    QMessageBox.Yes)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    test = Test()
    # Qt主循环 和 程序退出
    sys.exit(app.exec_())

(全文完)


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档