PyQt5: как изменить объект вне класса?
Новичок в PyQt5, как в принципе и в Python. Есть такой код:
from PyQt5 import QtCore, QtGui, QtWidgets
import time
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setEnabled(True)
MainWindow.resize(300, 70)
MainWindow.setMinimumSize(QtCore.QSize(300, 70))
MainWindow.setMaximumSize(QtCore.QSize(300, 70))
MainWindow.setBaseSize(QtCore.QSize(300, 70))
MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
MainWindow.setMouseTracking(False)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.some_label = QtWidgets.QLabel(self.centralwidget)
self.some_label.setGeometry(QtCore.QRect(0, 0, 300, 70))
self.some_label.setCursor(QtGui.QCursor(QtCore.Qt.BlankCursor))
self.some_label.setText("")
self.some_label.setObjectName("some_label")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Some Window"))
def change_some_label(self, text):
self.some_label.setText(self, text)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
time.sleep(3)
ui.change_text(ui, "Some New Label")
sys.exit(app.exec_())
Суть в том, есть функция change_text внутри класса Ui_MainWindow, которая меняет текст объекта some_label. Но я не могу нормально вызвать ее вне класса. Не подскажите, как правильно сделать, что бы текст изменился уже после открытия окна и вне класса.
Заранее благодарю, С уважением.
Ответы (1 шт):
Не изменяйте код, сгенерированный
Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.Не используйте
time.sleep(3)- это замораживает интерфейс.Как вариант вы можете использовать
Таймеродиночного выстрела, который срабатывает только один раз. Больше https://doc.qt.io/qt-5/qtimer.html#singleShot-prop
from PyQt5 import QtCore, QtGui, QtWidgets
#import time # ---
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setEnabled(True)
MainWindow.resize(300, 70)
MainWindow.setMinimumSize(QtCore.QSize(300, 70))
MainWindow.setMaximumSize(QtCore.QSize(300, 70))
MainWindow.setBaseSize(QtCore.QSize(300, 70))
MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
MainWindow.setMouseTracking(False)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.some_label = QtWidgets.QLabel(self.centralwidget)
self.some_label.setGeometry(QtCore.QRect(0, 0, 300, 70))
self.some_label.setCursor(QtGui.QCursor(QtCore.Qt.BlankCursor))
self.some_label.setText("")
self.some_label.setObjectName("some_label")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Some Window"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
text = "Some New Label" # +++
QtCore.QTimer.singleShot(3000, lambda text=text: self.change_some_label(text)) # +++
def change_some_label(self, text):
# self.some_label.setText(self, text) # - self
self.some_label.setText(text) # +++
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
# MainWindow = QtWidgets.QMainWindow()
# ui = Ui_MainWindow()
# ui.setupUi(MainWindow)
# MainWindow.show()
# time.sleep(3)
# ui.change_text(ui, "Some New Label")
w = MainWindow()
w.show()
sys.exit(app.exec_())
