Загрузка данных


```python
import sys
from PyQt6.QtWidgets import *
from PyQt6.QtGui import QRegularExpressionValidator
from PyQt6.QtCore import QRegularExpression

app = QApplication(sys.argv)

s = QWidget()
s.setWindowTitle("Тест")
s.resize(500, 600)

stak = QStackedWidget()

p1 = QWidget()
l1 = QVBoxLayout(p1)

l1.addWidget(QLabel("Вопрос 1. Выберите вариант A"))
cb1a = QCheckBox("A"); l1.addWidget(cb1a)
cb1b = QCheckBox("B"); l1.addWidget(cb1b)

l1.addWidget(QLabel("Вопрос 2. Выберите вариант B"))
cb2a = QCheckBox("A"); l1.addWidget(cb2a)
cb2b = QCheckBox("B"); l1.addWidget(cb2b)

l1.addWidget(QLabel("Вопрос 3. Выберите оба"))
cb3a = QCheckBox("A"); l1.addWidget(cb3a)
cb3b = QCheckBox("B"); l1.addWidget(cb3b)

l1.addWidget(QLabel("Вопрос 4. Выберите вариант A"))
cb4a = QCheckBox("A"); l1.addWidget(cb4a)
cb4b = QCheckBox("B"); l1.addWidget(cb4b)

l1.addWidget(QLabel("Вопрос 5. Выберите вариант B"))
cb5a = QCheckBox("A"); l1.addWidget(cb5a)
cb5b = QCheckBox("B"); l1.addWidget(cb5b)

stak.addWidget(p1)

p2 = QWidget()
l2 = QVBoxLayout(p2)

l2.addWidget(QLabel("Вопрос 1. Столица России?"))
g1 = QButtonGroup(p2)
rb1a = QRadioButton("Москва"); g1.addButton(rb1a); l2.addWidget(rb1a)
rb1b = QRadioButton("СПб");    g1.addButton(rb1b); l2.addWidget(rb1b)

l2.addWidget(QLabel("Вопрос 2. 7*8 = ?"))
g2 = QButtonGroup(p2)
rb2a = QRadioButton("54"); g2.addButton(rb2a); l2.addWidget(rb2a)
rb2b = QRadioButton("56"); g2.addButton(rb2b); l2.addWidget(rb2b)

l2.addWidget(QLabel("Вопрос 3. Газ в атмосфере?"))
g3 = QButtonGroup(p2)
rb3a = QRadioButton("O2"); g3.addButton(rb3a); l2.addWidget(rb3a)
rb3b = QRadioButton("N2"); g3.addButton(rb3b); l2.addWidget(rb3b)

l2.addWidget(QLabel("Вопрос 4. Первый полёт в космос?"))
g4 = QButtonGroup(p2)
rb4a = QRadioButton("1957"); g4.addButton(rb4a); l2.addWidget(rb4a)
rb4b = QRadioButton("1961"); g4.addButton(rb4b); l2.addWidget(rb4b)

l2.addWidget(QLabel("Вопрос 5. Автор 'Войны и мира'?"))
g5 = QButtonGroup(p2)
rb5a = QRadioButton("Толстой"); g5.addButton(rb5a); l2.addWidget(rb5a)
rb5b = QRadioButton("Чехов");   g5.addButton(rb5b); l2.addWidget(rb5b)

stak.addWidget(p2)

p3 = QWidget()
l3 = QVBoxLayout(p3)

l3.addWidget(QLabel("Вопрос 1. Введите целое число"))
le1 = QLineEdit()
le1.setValidator(QRegularExpressionValidator(QRegularExpression(r"^\d+$")))
l3.addWidget(le1)

l3.addWidget(QLabel("Вопрос 2. Введите целое число"))
le2 = QLineEdit()
le2.setValidator(QRegularExpressionValidator(QRegularExpression(r"^\d+$")))
l3.addWidget(le2)

l3.addWidget(QLabel("Вопрос 3. Введите вещественное число"))
le3 = QLineEdit()
le3.setValidator(QRegularExpressionValidator(QRegularExpression(r"^\d+([.,]\d+)?$")))
l3.addWidget(le3)

l3.addWidget(QLabel("Вопрос 4. Введите дату ДД.ММ.ГГГГ"))
le4 = QLineEdit()
le4.setValidator(QRegularExpressionValidator(QRegularExpression(r"^\d{2}\.\d{2}\.\d{4}$")))
l3.addWidget(le4)

l3.addWidget(QLabel("Вопрос 5. Введите вещественное число"))
le5 = QLineEdit()
le5.setValidator(QRegularExpressionValidator(QRegularExpression(r"^\d+([.,]\d+)?$")))
l3.addWidget(le5)

stak.addWidget(p3)

p4 = QWidget()
l4 = QVBoxLayout(p4)
l4.addWidget(QLabel("Результаты сессии"))
stak.addWidget(p4)

p5 = QWidget()
l5 = QVBoxLayout(p5)
l5.addWidget(QLabel("Анализ по вопросам"))
stak.addWidget(p5)


def go_prev():
    if stak.currentIndex() > 0:
        stak.setCurrentIndex(stak.currentIndex() - 1)


def go_next():
    i = stak.currentIndex()

    if i == 1:
        if not (rb1a.isChecked() or rb1b.isChecked()) or \
           not (rb2a.isChecked() or rb2b.isChecked()) or \
           not (rb3a.isChecked() or rb3b.isChecked()) or \
           not (rb4a.isChecked() or rb4b.isChecked()) or \
           not (rb5a.isChecked() or rb5b.isChecked()):
            QMessageBox.warning(s, "Ошибка", "Ответьте на все вопросы!")
            return

    if i == 2:
        if not le1.text().strip() or not le2.text().strip() or \
           not le3.text().strip() or not le4.text().strip() or not le5.text().strip():
            QMessageBox.warning(s, "Ошибка", "Заполните все поля!")
            return

    if i < stak.count() - 1:
        stak.setCurrentIndex(i + 1)

        if i + 1 == 3:
            v1 = (cb1a.isChecked() and not cb1b.isChecked())
            v2 = (cb2b.isChecked() and not cb2a.isChecked())
            v3 = (cb3a.isChecked() and cb3b.isChecked())
            v4 = (cb4a.isChecked() and not cb4b.isChecked())
            v5 = (cb5b.isChecked() and not cb5a.isChecked())

            v6  = rb1a.isChecked()
            v7  = rb2b.isChecked()
            v8  = rb3b.isChecked()
            v9  = rb4b.isChecked()
            v10 = rb5a.isChecked()

            v11 = le1.text().strip() == "42"
            v12 = le2.text().strip() == "7"
            v13 = abs(float(le3.text().replace(",", ".")) - 3.14) < 1e-6
            v14 = le4.text().strip() == "01.01.2020"
            v15 = abs(float(le5.text().replace(",", ".")) - 2.5) < 1e-6

            correct = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 + v11 + v12 + v13 + v14 + v15
            wrong = 15 - correct

            while l4.count():
                w = l4.takeAt(0).widget()
                if w: w.deleteLater()
            l4.addWidget(QLabel("Дано верных ответов: " + str(correct)))
            l4.addWidget(QLabel("Дано не верных ответов: " + str(wrong)))
            l4.addWidget(QLabel("Процент верных: " + str(round(correct / 15 * 100, 1)) + "%"))
            l4.addWidget(QLabel("Процент не верных: " + str(round(wrong / 15 * 100, 1)) + "%"))

        if i + 1 == 4:
            v1 = (cb1a.isChecked() and not cb1b.isChecked())
            v2 = (cb2b.isChecked() and not cb2a.isChecked())
            v3 = (cb3a.isChecked() and cb3b.isChecked())
            v4 = (cb4a.isChecked() and not cb4b.isChecked())
            v5 = (cb5b.isChecked() and not cb5a.isChecked())

            v6  = rb1a.isChecked()
            v7  = rb2b.isChecked()
            v8  = rb3b.isChecked()
            v9  = rb4b.isChecked()
            v10 = rb5a.isChecked()

            v11 = le1.text().strip() == "42"
            v12 = le2.text().strip() == "7"
            v13 = abs(float(le3.text().replace(",", ".")) - 3.14) < 1e-6
            v14 = le4.text().strip() == "01.01.2020"
            v15 = abs(float(le5.text().replace(",", ".")) - 2.5) < 1e-6

            while l5.count():
                w = l5.takeAt(0).widget()
                if w: w.deleteLater()
            l5.addWidget(QLabel("Вопрос 1: " + ("верно" if v1 else "неверно")))
            l5.addWidget(QLabel("Вопрос 2: " + ("верно" if v2 else "неверно")))
            l5.addWidget(QLabel("Вопрос 3: " + ("верно" if v3 else "неверно")))
            l5.addWidget(QLabel("Вопрос 4: " + ("верно" if v4 else "неверно")))
            l5.addWidget(QLabel("Вопрос 5: " + ("верно" if v5 else "неверно")))
            l5.addWidget(QLabel("Вопрос 6: " + ("верно" if v6 else "неверно")))
            l5.addWidget(QLabel("Вопрос 7: " + ("верно" if v7 else "неверно")))
            l5.addWidget(QLabel("Вопрос 8: " + ("верно" if v8 else "неверно")))
            l5.addWidget(QLabel("Вопрос 9: " + ("верно" if v9 else "неверно")))
            l5.addWidget(QLabel("Вопрос 10: " + ("верно" if v10 else "неверно")))
            l5.addWidget(QLabel("Вопрос 11: " + ("верно" if v11 else "неверно")))
            l5.addWidget(QLabel("Вопрос 12: " + ("верно" if v12 else "неверно")))
            l5.addWidget(QLabel("Вопрос 13: " + ("верно" if v13 else "неверно")))
            l5.addWidget(QLabel("Вопрос 14: " + ("верно" if v14 else "неверно")))
            l5.addWidget(QLabel("Вопрос 15: " + ("верно" if v15 else "неверно")))


btn_prev = QPushButton("◀ Назад")
btn_next = QPushButton("Вперёд ▶")
btn_prev.clicked.connect(go_prev)
btn_next.clicked.connect(go_next)

nav = QHBoxLayout()
nav.addWidget(btn_prev)
nav.addWidget(btn_next)

layout = QVBoxLayout(s)
layout.addWidget(stak)
layout.addLayout(nav)

s.show()
sys.exit(app.exec())
```