Untitled

 avatar
unknown
plain_text
a year ago
9.2 kB
4
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_())
Leave a Comment