今天放上之前的python有趣的案例集中的模拟在线考试代码,有些功能还没有完善,愿意修改的同学可以自己拿源代码修改。
运行效果视频:
questions.json 文件代码
模拟题库,可以自己手动往里添加题目,也可以导入题库(这个内容在之后的随机出试卷的案例中会讲解),这里直接使用现成的题库文件,里面的问题有些是重复的,仅仅做测试使用。
{
"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 文件
该文件是界面的代码,由设计界面图转化过来的,导入到主代码使用即可。
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 主程序文件
主程序文件代码,如果做课的话或者拆分子任务的话,可以拆成很多小任务实现,比如拆分为两节课可以这样写:
课程(上)
课程(下)
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_())
(全文完)