Как достучаться до элемента в другом классе?

Например, я хочу изменить текст кнопки, привязав ее к функции из другого класса. Но я получаю сообщение об ошибке в строке

self.ui.pushButton.setText("OK"):

AttributeError: 'bool' object has no attribute 'ui'

main.py:

from PySide6.QtWidgets import QApplication, QWidget

import test_gui

class App(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.ui = test_gui.Ui_Form()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(Second.func)

class Second(App):
    def __init__(self):
        App.__init__(self)

    def func(self):
        self.ui.pushButton.setText("OK")

if __name__ == "__main__":
    app = QApplication([])
    mw = App()
    mw.show()
    app.exec()

test_gui.py:

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QPushButton, QSizePolicy, QWidget)

class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(392, 279)
        self.pushButton = QPushButton(Form)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(120, 110, 75, 24))

        self.retranslateUi(Form)

        QMetaObject.connectSlotsByName(Form)
    # setupUi

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
        self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
    # retranslateUi

Подскажите, пожалуйста, что я не так делаю?


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

Автор решения: Alexander Chernin

Через сигналы/слоты (не путайте объект класса и сам класс):

from PySide6.QtCore import QObject, Signal, Slot

class App(QWidget):

    # Сигнал
    clicked = Signal()

    def __init__(self):
        QWidget.__init__(self)
        self.ui = test_gui.Ui_Form()
        self.ui.setupUi(self)

        # Вызываем сигнал
        self.ui.pushButton.clicked.connect(self.clicked.emit)

class Second(App):
    def __init__(self):
        App.__init__(self)

    @Slot()
    def func(self):
        self.ui.pushButton.setText("OK")

if __name__ == "__main__":
    app = QApplication([])

    mw = App()     # Первое окно
    sec = Second() # Второе окно
    
    # Соединяем сигнал со слотом
    mw.clicked.connect(sec.func)

    mw.show()
    sec.show()

    app.exec()
→ Ссылка
Автор решения: S. Nick

Как вариант:

'''
from PySide6.QtWidgets import QApplication, QWidget
...
'''
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


#from test_gui import Ui_Form
class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(392, 279)
        self.pushButton = QPushButton(Form)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(120, 110, 75, 24))

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

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
        self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))


class Second():                                                              ## ??? (App):
    def __init__(self, parent=None):                                         # +++ parent
        super().__init__()

        self.parent = parent                                                 # +++ parent

    def func(self):
        if self.parent.pushButton.text() == "OK":
            self.parent.pushButton.setText("PushButton")
        else:
            self.parent.pushButton.setText("OK")                             # +++ parent


class App(QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
#        QWidget.__init__(self)
#        self.ui = test_gui.Ui_Form()
#        self.ui.setupUi(self)
#        self.ui.pushButton.clicked.connect(Second.func)

        self.setupUi(self)

        # создайте экзкмпляр класса !!!
        self.second = Second(self)                                          # +++ (self)

#        self.pushButton.clicked.connect(Second.func)
        self.pushButton.clicked.connect(self.second.func)                   # +++ (self.second.func)



if __name__ == "__main__":
    app = QApplication([])
    mw = App()
    mw.show()
    app.exec()

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

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

→ Ссылка