Untitled
unknown
plain_text
2 years ago
9.2 kB
12
Indexable
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.QtCore import QCoreApplication
from PyQt5 import QtCore, QtWidgets
import random
from question_bank import pcap_questions
from PyQt5 import QtCore, QtWidgets
user_answers = {}
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.next_button = QtWidgets.QPushButton(self.centralwidget)
self.next_button.setGeometry(QtCore.QRect(480, 470, 75, 23))
self.next_button.setObjectName("next_button")
self.previous_button = QtWidgets.QPushButton(self.centralwidget)
self.previous_button.setGeometry(QtCore.QRect(230, 470, 75, 23))
self.previous_button.setObjectName("previous_button")
self.question = QtWidgets.QLabel(self.centralwidget)
self.question.setGeometry(QtCore.QRect(60, 40, 651, 231))
self.question.setObjectName("question")
self.copyright_label = QtWidgets.QLabel(self.centralwidget)
self.copyright_label.setGeometry(QtCore.QRect(680, 540, 121, 20))
self.copyright_label.setObjectName("copyright_label")
self.radio_button_a = QtWidgets.QRadioButton(self.centralwidget)
self.radio_button_a.setGeometry(QtCore.QRect(230, 300, 370, 30))
self.radio_button_a.setObjectName("radio_button_a")
self.radio_button_b = QtWidgets.QRadioButton(self.centralwidget)
self.radio_button_b.setGeometry(QtCore.QRect(230, 340, 370, 30))
self.radio_button_b.setObjectName("radio_button_b")
self.radio_button_c = QtWidgets.QRadioButton(self.centralwidget)
self.radio_button_c.setGeometry(QtCore.QRect(230, 380, 370, 30))
self.radio_button_c.setObjectName("radio_button_c")
self.radio_button_d = QtWidgets.QRadioButton(self.centralwidget)
self.radio_button_d.setGeometry(QtCore.QRect(230, 420, 370, 30))
self.radio_button_d.setObjectName("radio_button_d")
self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(0, 540, 118, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.timer_label = QtWidgets.QLabel(self.centralwidget)
self.timer_label.setGeometry(QtCore.QRect(730, 0, 60, 20))
self.timer_label.setObjectName("timer_label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
self.menuPCAP_Quizzer = QtWidgets.QMenu(self.menubar)
self.menuPCAP_Quizzer.setObjectName("menuPCAP_Quizzer")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar.addAction(self.menuPCAP_Quizzer.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.next_button.setText(_translate("MainWindow", "Next"))
self.previous_button.setText(_translate("MainWindow", "Previous"))
self.question.setText(_translate("MainWindow", " question"))
self.copyright_label.setText(_translate("MainWindow", "(c) Hauke Juri Schnepel"))
self.radio_button_a.setText(_translate("MainWindow", "RadioButton"))
self.radio_button_b.setText(_translate("MainWindow", "RadioButton"))
self.radio_button_c.setText(_translate("MainWindow", "RadioButton"))
self.radio_button_d.setText(_translate("MainWindow", "RadioButton"))
self.timer_label.setText(_translate("MainWindow", "TextLabel"))
self.menuPCAP_Quizzer.setTitle(_translate("MainWindow", "PCAP Quizzer"))
class QuizApp(QMainWindow):
def __init__(self, questions):
super(QuizApp, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.question_bank = questions
self.questions = random.sample(self.question_bank, 10) # Randomly select n questions from the question databank
self.current_question_index = 0
self.answers = []
self.remaining_time = (len(questions) * 90) # 90 seconds time per question
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_timer)
self.ui.progressBar.setValue(0)
# Connect Next / Previous buttons to functions
self.ui.next_button.clicked.connect(self.next_question)
self.ui.previous_button.clicked.connect(self.prev_question)
self.ui.next_button.clicked.connect(self.update_progress)
self.ui.previous_button.clicked.connect(self.update_progress)
self.start_quiz()
def start_quiz(self):
'''Shuffles the questions to give a new, random order every time'''
random.shuffle(self.questions) # Redundant?
self.show_question()
def show_question(self):
'''Presents the current questions by updating existing labels'''
#print(user_answers) => check if answer was entered into dictionary REMOVE LATER
question = self.questions[self.current_question_index]
self.ui.question.setText(f"{self.current_question_index + 1}. {question['question']}")
options = random.sample(question['options'], len(question['options']))
# Update radio buttons and set text directly from the question's options
for i, option in enumerate(options, start=97):
radio_button = getattr(self.ui, f"radio_button_{chr(i)}")
radio_button.setText(option)
# Hide previous button on the first question and next button on the last to avoid going out of bounds
if self.current_question_index == 0:
self.ui.previous_button.hide()
else:
self.ui.previous_button.show()
if self.current_question_index == len(self.questions) - 1:
self.ui.next_button.hide()
else:
self.ui.next_button.show()
self.timer.start(1000) # Update timer every second
def next_question(self):
'''Goes to the next question; updates current question index, saves selected answer'''
self.timer.stop()
if self.ui.radio_button_a.isChecked(): # If radio button is checked, save into dictionary via question index as key
user_answers[self.current_question_index +1] = self.ui.radio_button_a.text()
elif self.ui.radio_button_b.isChecked():
user_answers[self.current_question_index +1] = self.ui.radio_button_b.text()
elif self.ui.radio_button_c.isChecked():
user_answers[self.current_question_index +1] = self.ui.radio_button_c.text()
elif self.ui.radio_button_d.isChecked():
user_answers[self.current_question_index +1] = self.ui.radio_button_d.text()
else:
pass
self.current_question_index += 1 # Update question index to show next question
self.ui.radio_button_a.setChecked(False) # Uncheck all radio buttons before showing next question
self.ui.radio_button_b.setChecked(False)
self.ui.radio_button_c.setChecked(False)
self.ui.radio_button_d.setChecked(False)
QCoreApplication.processEvents()
if self.current_question_index < len(self.questions): # Shows question unless current question goes beyond the total range, then show results instead
self.show_question()
else:
self.show_results()
def prev_question(self):
'''Goes to the previous question; updates current question index '''
self.timer.stop()
self.current_question_index -= 1
if self.current_question_index >= 0:
self.show_question()
def update_timer(self):
'''Updates the timer every second'''
if self.remaining_time > 0:
self.remaining_time -= 1
minutes, seconds = divmod(self.remaining_time, 60)
self.ui.timer_label.setText(f"Time: {minutes:02d}:{seconds:02d}")
else:
self.timer.stop()
self.show_results()
def update_progress(self):
'''Updates the progress bar based on the current question'''
self.ui.progressBar.setValue(int(self.current_question_index / len(self.question_bank) * 100)) # 2.5% per question assuming 40 total
def show_results(self):
# TO DO: Display results
...
if __name__ == "__main__":
app = QApplication(sys.argv)
# Your larger question bank
question_bank = pcap_questions
quiz_app = QuizApp(question_bank)
quiz_app.show()
sys.exit(app.exec_())Editor is loading...
Leave a Comment