Проблема с кнопкой в PyQt5
Всем привет, имеется вот такой вот код
from PyQt5 import QtCore, QtGui, QtWidgets
import openpyxl
from random import randint
from PyQt5.QtWidgets import QMessageBox
import os
question_list = []
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1223, 578)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.QuestionField = QtWidgets.QTextBrowser(self.centralwidget)
self.QuestionField.setObjectName("QuestionField")
self.verticalLayout.addWidget(self.QuestionField)
self.EntryField = QtWidgets.QPlainTextEdit(self.centralwidget)
self.EntryField.setObjectName("EntryField")
self.verticalLayout.addWidget(self.EntryField)
self.ButtonNext = QtWidgets.QPushButton(self.centralwidget)
self.ButtonNext.setObjectName("ButtonNext")
self.verticalLayout.addWidget(self.ButtonNext)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.start_quiz()
def clicked_next(self):
self.ButtonNext.clicked.connect(self.get_next_question)
def get_next_question(self):
self.clicked_next()
wb_obj = openpyxl.load_workbook("questions.xlsx")
if len(question_list) < 3:
wb_sheet = wb_obj['Block_1']
elif len(question_list) == 3:
wb_sheet = wb_obj['Block_2']
elif len(question_list) == 4:
wb_sheet = wb_obj['Block_3']
else:
sys.exit(app.exec_())
rows = wb_sheet.max_row
nums_wb = randint(2, rows)
question = wb_sheet[f'A{nums_wb}'].value
print(question)
print(len(question_list))
self.QuestionField.setText(question)
question_list.append(question)
def start_quiz(self):
greetings = QMessageBox()
btn_begin = QtWidgets.QPushButton()
greetings.setWindowTitle('Приветствие')
greetings.setText(
f'Приветствую тебя {os.getlogin()}. Предлогаю в начале рабочего дня пройти тебе тест на знание наших цен и предложений')
greetings.setIcon(QMessageBox.Information)
greetings.exec_()
self.get_next_question()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Опросник"))
self.ButtonNext.setText(_translate("MainWindow", "Далее"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
При нажатии на кнопку далее, почему-то он дважды выдает значение, а не один раз.
Смысл такой, что в начале воспроизводиться приветственное сообщение из функции start_quiz, далее начинается опрос функция get_next_question и после того как пользователь ввел свой ответ и нажимает на кнопку clicked_next должна вызваться снова функция get_next_question и так пока длина списка не будет больше 4.
Но когда я нажимаю на кнопку далее, то функция смены вопроса начинает выдавать по 2 значения сразу.
Не знаю куда смотреть
Ответы (1 шт):
Вы не предоставили воспроизводимый пример. Без файла questions.xlsx проверить ваше приложение нет возможности.
Некоторые рекомендации для вас:
НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.строка
self.ButtonNext.clicked.connect(self.get_next_question)находится не в том месте, как и строкаself.wb_obj = openpyxl.load_workbook("questions.xlsx")ну и наконец, некоторое виртуальные мысли по поводу вашего кода, для вашей проверки см. ниже.
import os
import openpyxl
from random import randint
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1223, 578)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.QuestionField = QtWidgets.QTextBrowser(self.centralwidget)
self.QuestionField.setObjectName("QuestionField")
self.verticalLayout.addWidget(self.QuestionField)
self.EntryField = QtWidgets.QPlainTextEdit(self.centralwidget)
self.EntryField.setObjectName("EntryField")
self.verticalLayout.addWidget(self.EntryField)
self.ButtonNext = QtWidgets.QPushButton(self.centralwidget)
self.ButtonNext.setObjectName("ButtonNext")
self.verticalLayout.addWidget(self.ButtonNext)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Опросник"))
self.ButtonNext.setText(_translate("MainWindow", "Далее"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.question_list = [] # +++
self.wb_obj = openpyxl.load_workbook("questions.xlsx") # +++
self.ButtonNext.clicked.connect(self.get_next_question) # !!! +++
self.start_quiz()
self.get_next_question()
# def clicked_next(self):
# self.ButtonNext.clicked.connect(self.get_next_question)
def get_next_question(self):
# self.clicked_next()
# wb_obj = openpyxl.load_workbook("questions.xlsx")
if len(self.question_list) < 3:
wb_sheet = self.wb_obj['Block_1']
elif len(self.question_list) == 3:
wb_sheet = self.wb_obj['Block_2']
elif len(self.question_list) == 4:
wb_sheet = self.wb_obj['Block_3']
else:
# sys.exit(app.exec_())
self.close()
rows = wb_sheet.max_row
nums_wb = randint(2, rows)
question = wb_sheet[f'A{nums_wb}'].value
print(question)
print(len(self.question_list))
self.QuestionField.setText(question)
self.question_list.append(question)
def start_quiz(self):
greetings = QMessageBox()
btn_begin = QtWidgets.QPushButton()
greetings.setWindowTitle('Приветствие')
greetings.setText(
f'Приветствую тебя {os.getlogin()}. Предлогаю в начале рабочего дня пройти тебе тест на знание наших цен и предложений')
greetings.setIcon(QMessageBox.Information)
greetings.exec_()
# self.get_next_question()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())