Не обновляются формы в PyQt5
Имеется программа, в которой есть тест с вопросами:
В котором необходимо выбрать правильный вариант ответа, нажать кнопку "Проверить ответ", а после нажать кнопку "Перейти далее", чтобы загрузился новый вопрос.
Но при нажатии "Перейти далее" этого не происходит, хотя алгоритм работы построения такой:
создаются формы (метод
create_all_forms)формы помещаются в области (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 шт):
В общем, проблему решил тем, что отдельным методом создал формы, а другим методом уже их заполнил и последующими вызовами просто менял текст внутри форм.
Как вариант. Я отметил для вас строки, в которые внес изменения и добавил некоторые нужные вещи. Попробуйте:
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_())

