Ошибка со сменой текста 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 шт):
У вас есть код, сгенерированный 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_())
Если вам что-то не понятно - спросите, я отвечу.
