Не обновляются формы в PyQt5

Имеется программа, в которой есть тест с вопросами:

введите сюда описание изображения

В котором необходимо выбрать правильный вариант ответа, нажать кнопку "Проверить ответ", а после нажать кнопку "Перейти далее", чтобы загрузился новый вопрос.

Но при нажатии "Перейти далее" этого не происходит, хотя алгоритм работы построения такой:

  1. создаются формы (метод create_all_forms)

  2. формы помещаются в области (layouts) (метод create_layers)

После нажатия кнопки "Перейти далее" должны опять вызваться методы из алгоритма выше, они вызываются, но ничего не строят. Помогите, пожалуйста.. Вот код:

import sys

from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, \
    QGridLayout, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QLineEdit, QRadioButton
from PyQt5.QtCore import QTimer, QTime, Qt
from PyQt5.QtGui import QFont, QIcon, QPixmap

question_names = ['Вопрос 1', 'Вопрос 2', 'Вопрос 3', 'Вопрос 4', 'Вопрос 5']

question_values = {0: 'Верно ли, что информация в компьютере хранится\nв двоичном коде?',
                   1: 'Наименьшая единица информации называется:',
                   2: 'Элементной базой первых компьютеров являлись:',
                   3: 'Назовите устройства вывода информации:',
                   4: 'Назовите системы программирования:'}

question_answers = {
    0: ['Только числовая', 'Только числовая и текстовая', 'Любая информация', 'Вся за исключением видео'],
    1: ['байт', 'бит', 'бод', 'бит/с'],
    2: ['Микросхемы', 'Дискретные полупроводники', 'Радиолампы', 'Транзисторы'],
    3: ['Монитор', 'Мышь', 'Клавиатура', 'Принтер'],
    4: ['Delphi', 'Visual Basic', 'Microsoft', 'Turbo Pascal']
}

right_answers = {0: 'Любая информация',
                 1: 'бит',
                 2: 'Радиолампы',
                 3: 'Мышь',
                 4: 'Visual Basic'}


class FormBuilder(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.question_number = 0
        self.selected_answer = ''
        self.all_right_answers = 0

        self.create_all_forms()
        self.create_layers()

    def create_all_forms(self):
        print('yupie')
        self.question_name = QLabel(self)
        self.question_name.setText(question_names[self.question_number])
        self.question_name.setFont(QFont("Times", 28, QFont.Bold))

        self.question_value = QLabel(self)
        self.question_value.setText(question_values[self.question_number])
        self.question_value.setFont(QFont("Times", 16, QFont.Cursive))

        self.option_label = QLabel(self)
        self.option_label.setText('Варианты ответов:')
        self.option_label.setFont(QFont("Times", 16, QFont.DemiBold))

        self.first_rbutton = QRadioButton(question_answers[self.question_number][0])
        self.first_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        self.first_rbutton.setChecked(True)
        self.first_rbutton.value = question_answers[self.question_number][0]
        self.first_rbutton.toggled.connect(self.onClickedRadio)

        self.second_rbutton = QRadioButton(question_answers[self.question_number][1])
        self.second_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        self.second_rbutton.toggled.connect(self.onClickedRadio)
        self.second_rbutton.value = question_answers[self.question_number][1]

        self.third_rbutton = QRadioButton(question_answers[self.question_number][2])
        self.third_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        self.third_rbutton.toggled.connect(self.onClickedRadio)
        self.third_rbutton.value = question_answers[self.question_number][2]

        self.fourth_rbutton = QRadioButton(question_answers[self.question_number][3])
        self.fourth_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        self.fourth_rbutton.toggled.connect(self.onClickedRadio)
        self.fourth_rbutton.value = question_answers[self.question_number][3]

        self.check_answer_button = QPushButton(self)
        self.check_answer_button.setText('Проверить ответ')
        self.check_answer_button.setFont(QFont("Times", 16, QFont.DemiBold))
        self.check_answer_button.clicked.connect(self.onClickedCheck)

        self.next_button = QPushButton(self)
        self.next_button.setText('Перейти далее')
        self.next_button.setFont(QFont("Times", 16, QFont.DemiBold))
        self.next_button.clicked.connect(self.onClickedNext)

        self.lower_text_label = QLabel(self)
        self.lower_text_label.setText('Нажмите "Проверить ответ" для проверки.')
        self.lower_text_label.setFont(QFont("Times", 16, QFont.Cursive))
        self.lower_text_label.setStyleSheet(
            'border-style: solid; border-width: 1px; border-color: gray; border-radius: 6;')

    def create_layers(self):
        layout = QVBoxLayout(self)

        question_number_layer = QHBoxLayout()
        question_number_layer.addWidget(self.question_name)
        layout.addLayout(question_number_layer)

        question_value_layer = QHBoxLayout()
        question_value_layer.addWidget(self.question_value)
        layout.addLayout(question_value_layer)

        option_layer = QHBoxLayout()
        option_layer.addWidget(self.option_label)
        layout.addLayout(option_layer)

        options_horizontal_layer = QHBoxLayout()
        options_layer = QVBoxLayout()
        options_layer.addWidget(self.first_rbutton)
        options_layer.addWidget(self.second_rbutton)
        options_layer.addWidget(self.third_rbutton)
        options_layer.addWidget(self.fourth_rbutton)
        options_horizontal_layer.addLayout(options_layer)
        layout.addLayout(options_horizontal_layer)

        buttons_layer = QHBoxLayout()
        buttons_layer.addWidget(self.check_answer_button)
        buttons_layer.addWidget(self.next_button)
        layout.addLayout(buttons_layer)

        text_layer = QHBoxLayout()
        text_layer.addWidget(self.lower_text_label)
        layout.addLayout(text_layer)

    def onClickedRadio(self):
        radioButton = self.sender()
        if radioButton.isChecked():
            self.selected_answer = radioButton.value

    def onClickedCheck(self):
        def turn_off_rbuttons():
            self.first_rbutton.setEnabled(False)
            self.second_rbutton.setEnabled(False)
            self.third_rbutton.setEnabled(False)
            self.fourth_rbutton.setEnabled(False)

        def turn_off_check_button():
            self.check_answer_button.setEnabled(False)

        if self.selected_answer == right_answers[self.question_number]:
            self.lower_text_label.setText('Правильный ответ!')
            self.all_right_answers += 1
            self.question_number += 1
            turn_off_rbuttons()
            turn_off_check_button()
        else:
            self.lower_text_label.setText('Неправильный ответ!')
            turn_off_rbuttons()
            turn_off_check_button()

    def onClickedNext(self):
        self.create_all_forms()
        self.create_layers()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.build_skeleton_with_basic_settings()
        self.create_and_connect_grid()

    def build_skeleton_with_basic_settings(self):
        self.setFixedSize(500, 360)
        self.setWindowTitle('Тест по информатике')

    def create_and_connect_grid(self):
        self.grid = QGridLayout(self.centralWidget)
        self.formBuilder = FormBuilder()
        self.grid.addWidget(self.formBuilder, 0, 0, Qt.AlignTop)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

Ответы (2 шт):

Автор решения: GunTHE

В общем, проблему решил тем, что отдельным методом создал формы, а другим методом уже их заполнил и последующими вызовами просто менял текст внутри форм.

→ Ссылка
Автор решения: S. Nick

Как вариант. Я отметил для вас строки, в которые внес изменения и добавил некоторые нужные вещи. Попробуйте:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QMessageBox, \
    QGridLayout, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QLineEdit, QRadioButton
from PyQt5.QtCore import QTimer, QTime, Qt, pyqtSignal
from PyQt5.QtGui import QFont, QIcon, QPixmap


question_names = ['Вопрос 1', 'Вопрос 2', 'Вопрос 3', 'Вопрос 4', 'Вопрос 5']

question_values = {0: 'Верно ли, что информация в компьютере хранится\nв двоичном коде?',
                   1: 'Наименьшая единица информации называется:',
                   2: 'Элементной базой первых компьютеров являлись:',
                   3: 'Назовите устройства вывода информации:',
                   4: 'Назовите системы программирования:'}

question_answers = {
    0: ['Только числовая', 'Только числовая и текстовая', 'Любая информация', 'Вся за исключением видео'],
    1: ['байт', 'бит', 'бод', 'бит/с'],
    2: ['Микросхемы', 'Дискретные полупроводники', 'Радиолампы', 'Транзисторы'],
    3: ['Монитор', 'Мышь', 'Клавиатура', 'Принтер'],
    4: ['Delphi', 'Visual Basic', 'Microsoft', 'Turbo Pascal']
}

right_answers = {0: 'Любая информация',
                 1: 'бит',
                 2: 'Радиолампы',
                 3: 'Мышь',
                 4: 'Visual Basic'}


class FormBuilder(QWidget):
    def __init__(self, question_number=0, ):                                  # +++
        super().__init__() 

        self.question_number = question_number                                # +++
        self.selected_answer = ''
        self.all_right_answers = 0
        
        self.layout = QVBoxLayout(self)                                       # +++

        self.create_all_forms()
#??        self.create_layers()

    def create_all_forms(self):
        print('yupie')
        self.question_name = QLabel(self)
        self.question_name.setText(question_names[self.question_number])
        self.question_name.setFont(QFont("Times", 28, QFont.Bold))
        self.question_value = QLabel(self)
        self.question_value.setText(question_values[self.question_number])
        self.question_value.setFont(QFont("Times", 16, QFont.Cursive))
        self.option_label = QLabel(self)
        self.option_label.setText('Варианты ответов:')
        self.option_label.setFont(QFont("Times", 16, QFont.DemiBold))

        self.first_rbutton = QRadioButton(question_answers[self.question_number][0])
        self.first_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        
#        self.first_rbutton.setChecked(True)
        self.first_rbutton.setChecked(False)
        
        self.first_rbutton.value = question_answers[self.question_number][0]
        self.first_rbutton.toggled.connect(self.onClickedRadio)
        self.second_rbutton = QRadioButton(question_answers[self.question_number][1])
        self.second_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        self.second_rbutton.toggled.connect(self.onClickedRadio)
        self.second_rbutton.value = question_answers[self.question_number][1]
        self.third_rbutton = QRadioButton(question_answers[self.question_number][2])
        self.third_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        self.third_rbutton.toggled.connect(self.onClickedRadio)
        self.third_rbutton.value = question_answers[self.question_number][2]
        self.fourth_rbutton = QRadioButton(question_answers[self.question_number][3])
        self.fourth_rbutton.setFont(QFont("Times", 16, QFont.Cursive))
        self.fourth_rbutton.toggled.connect(self.onClickedRadio)
        self.fourth_rbutton.value = question_answers[self.question_number][3]

        self.check_answer_button = QPushButton(self)
        self.check_answer_button.setText('Проверить ответ')
        self.check_answer_button.setFont(QFont("Times", 16, QFont.DemiBold))
        self.check_answer_button.clicked.connect(self.onClickedCheck)
        self.next_button = QPushButton(self)
        self.next_button.setText('Перейти далее')
        self.next_button.setFont(QFont("Times", 16, QFont.DemiBold))
        self.next_button.setEnabled(False)                                        # +++
        self.next_button.clicked.connect(self.onClickedNext)

        self.lower_text_label = QLabel(self)
        self.lower_text_label.setText('Нажмите "Проверить ответ" для проверки.')
        self.lower_text_label.setFont(QFont("Times", 16, QFont.Cursive))
        self.lower_text_label.setStyleSheet(
            'border-style: solid; border-width: 1px; border-color: gray; border-radius: 6;')

        question_number_layer = QHBoxLayout()
        question_number_layer.addWidget(self.question_name)
        self.layout.addLayout(question_number_layer)

        question_value_layer = QHBoxLayout()
        question_value_layer.addWidget(self.question_value)
        self.layout.addLayout(question_value_layer)

        option_layer = QHBoxLayout()
        option_layer.addWidget(self.option_label)
        self.layout.addLayout(option_layer)

        options_horizontal_layer = QHBoxLayout()
        options_layer = QVBoxLayout()
        options_layer.addWidget(self.first_rbutton)
        options_layer.addWidget(self.second_rbutton)
        options_layer.addWidget(self.third_rbutton)
        options_layer.addWidget(self.fourth_rbutton)
        options_horizontal_layer.addLayout(options_layer)
        self.layout.addLayout(options_horizontal_layer)

        buttons_layer = QHBoxLayout()
        buttons_layer.addWidget(self.check_answer_button)
        buttons_layer.addWidget(self.next_button)
        self.layout.addLayout(buttons_layer)

        text_layer = QHBoxLayout()
        text_layer.addWidget(self.lower_text_label)
        self.layout.addLayout(text_layer)

    def onClickedRadio(self):
        radioButton = self.sender()
        if radioButton.isChecked():
            self.selected_answer = radioButton.value

    def onClickedCheck(self):
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        if  not self.first_rbutton.isChecked() and \
            not self.second_rbutton.isChecked() and \
            not self.third_rbutton.isChecked() and \
            not self.fourth_rbutton.isChecked():
            msg = QMessageBox.information(self, 'Внимание', 
                    'Выберите ваш вариант ответа!')  
            return
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
        def turn_off_rbuttons():
            self.first_rbutton.setEnabled(False)
            self.second_rbutton.setEnabled(False)
            self.third_rbutton.setEnabled(False)
            self.fourth_rbutton.setEnabled(False)
            self.next_button.setEnabled(True)                                          # +++

        def turn_off_check_button():
            self.check_answer_button.setEnabled(False)

        if self.selected_answer == right_answers[self.question_number]:
            self.lower_text_label.setText('Правильный ответ!')
            self.all_right_answers += 1
#---            self.question_number += 1
            turn_off_rbuttons()
            turn_off_check_button()
        else:
            self.lower_text_label.setText('Неправильный ответ!')
            turn_off_rbuttons()
            turn_off_check_button()

    def onClickedNext(self):
#---        self.create_all_forms()
#---        self.create_layers()
        self.window().finish[self.question_number] = [self.selected_answer,                
                                                      right_answers[self.question_number]] # +++
        self.window().create_and_connect_grid()                                            # +++


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        
        self.len_questions = len(question_names)                               # +++
        self.current_question = 0                                              # +++
        self.finish = {}

        self.build_skeleton_with_basic_settings()
        self.grid = QGridLayout(self.centralWidget)                            # +++
        self.create_and_connect_grid()

    def build_skeleton_with_basic_settings(self):
        self.setFixedSize(500, 360)
        self.setWindowTitle('Тест по информатике')

    def create_and_connect_grid(self):
#---        self.grid = QGridLayout(self.centralWidget)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        if self.grid.count():
            self.current_question += 1
            w = self.grid.itemAt(0).widget()
            self.grid.removeWidget(w)     
            w.hide()
            
        if self.current_question < self.len_questions:
            formBuilder = FormBuilder(self.current_question)    
            self.grid.addWidget(formBuilder, 0, 0, Qt.AlignTop)
        else:
            label = QLabel("Вопрос:   Ваш ответ   Правильный ответ")
            for k, v in self.finish.items():
               label.setText(f'{label.text()}\n{question_names[k]}: {v[0]} <---> {v[1]}') 
            self.grid.addWidget(label, 0, 0, Qt.AlignCenter)   
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка