Ошибка со сменой текста Label'а в PyQt5

Столкнулся с проблемой вылета программы, если вставлять в аргументы Label'а переменную (с обычной строкой всё хорошо).

Вот сам код:

class RandomNumber:
    def __init__(self):
        self.minNum = int(ui.minNumEdit.text())
        self.maxNum = int(ui.maxNumEdit.text())
        self.randNum = randint(self.minNum, self.maxNum)

    def result(self):
        ui.resultLabel.setText('Result: ', str(self.randNum))

Код интерфейса:


from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(380, 250)
        Form.setMinimumSize(QtCore.QSize(380, 250))
        Form.setMaximumSize(QtCore.QSize(380, 250))
        Form.setStyleSheet("font-size: 14px;\n"
                           "font-weight: bold;")
        self.gridLayoutWidget = QtWidgets.QWidget(Form)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(140, 50, 109, 135))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.minNumLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.minNumLabel.setStyleSheet("text-align: center;")
        self.minNumLabel.setObjectName("minNumLabel")
        self.gridLayout.addWidget(self.minNumLabel, 1, 0, 1, 1)
        self.genButton = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.genButton.setObjectName("genButton")
        self.gridLayout.addWidget(self.genButton, 3, 0, 1, 2)
        self.resultLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.resultLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.resultLabel.setObjectName("resultLabel")
        self.gridLayout.addWidget(self.resultLabel, 4, 0, 1, 2)
        self.maxNumEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.maxNumEdit.setObjectName("maxNumEdit")
        self.gridLayout.addWidget(self.maxNumEdit, 2, 1, 1, 1)
        self.minNumEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.minNumEdit.setStyleSheet("")
        self.minNumEdit.setObjectName("minNumEdit")
        self.gridLayout.addWidget(self.minNumEdit, 1, 1, 1, 1)
        self.maxNumLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.maxNumLabel.setStyleSheet("text-align: center;")
        self.maxNumLabel.setObjectName("maxNumLabel")
        self.gridLayout.addWidget(self.maxNumLabel, 2, 0, 1, 1)
        self.errorLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.errorLabel.setVisible(False)
        self.errorLabel.setStyleSheet("color: red;\n"
                                      "text-align: center;")
        self.errorLabel.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.errorLabel.setTextFormat(QtCore.Qt.AutoText)
        self.errorLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.errorLabel.setObjectName("errorLabel")
        self.gridLayout.addWidget(self.errorLabel, 0, 0, 1, 2)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Random number"))
        self.minNumLabel.setText(_translate("Form", "Min:"))
        self.genButton.setText(_translate("Form", "Generate"))
        self.resultLabel.setText(_translate("Form", "Result:"))
        self.maxNumLabel.setText(_translate("Form", "Max:"))
        self.errorLabel.setText(_translate("Form", "Error"))


# if __name__ == '__main__':
#     app = QtWidgets.QApplication(sys.argv)
#     Form = QtWidgets.QWidget()
#     ui = Ui_Form()
#     ui.setupUi(Form)
#     Form.show()
#     sys.exit(app.exec_())

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

Автор решения: S. Nick

У вас есть код, сгенерированный Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета (в вашем случае QtWidgets.QWidget), и используйте созданный класс для его заполнения.

По событию нажатия кнопки genButton, вы вызываете метод result, в котором и делаем нужные расчеты.

self.genButton.clicked.connect(self.result)

что значит super().__init__()

На самом деле об этом много чего написано, попробуйте почитать https://www.educative.io/edpresso/what-is-super-in-python

что значит self.setupUi(self)

void QWidget::setupUi(QWidget *widget)

Устанавливает пользовательский интерфейс для указанного виджета. Примечание. Эта функция доступна с виджетами, которые являются производными от описаний пользовательского интерфейса, созданных с помощью uic. Больше https://doc.qt.io/qt-5/qwidget.html#setupUi и https://doc.qt.io/qt-5/designer-using-a-ui-file.html

обязательно ли импорты sys и randint должны быть в main?

нет, можно так:

import sys
from random import randint
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    ...

я предлагаю сделать так:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(380, 250)
        Form.setMinimumSize(QtCore.QSize(380, 250))
        Form.setMaximumSize(QtCore.QSize(380, 250))
        Form.setStyleSheet("font-size: 14px;\n"
                           "font-weight: bold;")
        self.gridLayoutWidget = QtWidgets.QWidget(Form)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(140, 50, 109, 135))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.minNumLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.minNumLabel.setStyleSheet("text-align: center;")
        self.minNumLabel.setObjectName("minNumLabel")
        self.gridLayout.addWidget(self.minNumLabel, 1, 0, 1, 1)
        self.genButton = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.genButton.setObjectName("genButton")
        self.gridLayout.addWidget(self.genButton, 3, 0, 1, 2)
        self.resultLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.resultLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.resultLabel.setObjectName("resultLabel")
        self.gridLayout.addWidget(self.resultLabel, 4, 0, 1, 2)
        self.maxNumEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.maxNumEdit.setObjectName("maxNumEdit")
        self.gridLayout.addWidget(self.maxNumEdit, 2, 1, 1, 1)
        self.minNumEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.minNumEdit.setStyleSheet("")
        self.minNumEdit.setObjectName("minNumEdit")
        self.gridLayout.addWidget(self.minNumEdit, 1, 1, 1, 1)
        self.maxNumLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.maxNumLabel.setStyleSheet("text-align: center;")
        self.maxNumLabel.setObjectName("maxNumLabel")
        self.gridLayout.addWidget(self.maxNumLabel, 2, 0, 1, 1)
        self.errorLabel = QtWidgets.QLabel(self.gridLayoutWidget)
        self.errorLabel.setVisible(False)
        self.errorLabel.setStyleSheet("color: red;\n"
                                      "text-align: center;")
        self.errorLabel.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.errorLabel.setTextFormat(QtCore.Qt.AutoText)
        self.errorLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.errorLabel.setObjectName("errorLabel")
        self.gridLayout.addWidget(self.errorLabel, 0, 0, 1, 2)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Random number"))
        self.minNumLabel.setText(_translate("Form", "Min:"))
        self.genButton.setText(_translate("Form", "Generate"))
        self.resultLabel.setText(_translate("Form", "Result:"))
        self.maxNumLabel.setText(_translate("Form", "Max:"))
        self.errorLabel.setText(_translate("Form", "Error"))

class RandomNumber(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.genButton.clicked.connect(self.result)

    def result(self):
        minNum = int(self.minNumEdit.text())
        maxNum = int(self.maxNumEdit.text())
        randNum = randint(minNum, maxNum)
        self.resultLabel.setText(f'Result: {randNum}')
        

if __name__ == '__main__':
    import sys
    from random import randint
    app = QtWidgets.QApplication(sys.argv)
    Form = RandomNumber()
    Form.show()
    sys.exit(app.exec_())

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

Если вам что-то не понятно - спросите, я отвечу.

→ Ссылка