Доступ к переменным класса QMainWindow — Pyside/PyQt

Я пишу приложение с графическим интерфейсом на Python, которое использует несколько сценариев .py. У меня есть переменная в QMainWindow, к которой мне нужно обратиться/получить доступ в других классах. У меня нет проблем с импортом различных модулей .py в модуль Ui_MainWindow.py, но я не могу получить доступ к переменным класса QMainWindow.

Это быстрый псевдокод того, что я пытаюсь:

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

        self.lineEditScanBarcode.returnPressed.connect(self.LoginAttempt)

    def LoginAttempt(self):
        self.user_barcode = self.lineEditScanBarcode.text()

Из чтения, которое я сделал по этому поводу, ссылаясь на переменные класса, я пришел к выводу, что с приведенной выше настройкой я должен иметь возможность ссылаться на переменную user_barcode в других классах следующим образом:

class Receipt(QWidget, Ui_Receipt):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setupUi(self)

        print(MainWindow.user_barcode)

Я использовал команду «печать», чтобы проверить, работает ли она, но получаю следующую ошибку:

Attribute Error: type object 'MainWindow' has no attribute 'user_barcode'

Может ли кто-нибудь увидеть ошибку, которую я явно делаю? Я искал SO для подобных запросов, но не нашел ничего подходящего.

Спасибо!

РЕДАКТИРОВАТЬ:

Вот настройка app.exec_(), я не уверен, правильно ли я передаю родителя.

if __name__ == '__main__':
    app = QApplication(sys.argv)
    showMainWindow = MainWindow()
    showReceipt = Receipt(MainWindow)
    showMainWindow.show()
    app.exec_()

Я пробовал разные комбинации, но получаю либо ошибку init, либо поднятую ошибку TypeError.


person jars121    schedule 25.11.2013    source источник


Ответы (1)


Причина, по которой пример кода не работает, заключается в том, что MainWindow является классом, тогда как user_barcode является атрибутом экземпляра этого класса.

Чтобы Receipt мог получить доступ к атрибуту user_barcode, ему должен быть каким-то образом доступен экземпляр MainWindow. И один из способов сделать это — установить MainWindow в качестве родителя Receipt.

Это позволит квитанции использовать родительский метод для доступа экземпляр MainWindow и его атрибуты. Конечно, это означает, что Receipt всегда должен иметь MainWindow в качестве родителя, поэтому его конструктор, вероятно, должен выглядеть примерно так:

class Receipt(QWidget, Ui_Receipt):
    def __init__(self, parent):
        if not isinstance(parent, MainWindow):
            raise TypeError('parent must be a MainWindow')
        super(Receipt, self).__init__(parent)
        self.setupUi(self)
        ...
        print(self.parent().user_barcode)
person ekhumoro    schedule 26.11.2013
comment
Спасибо за это эхуморо, это действительно имеет больше смысла. Я изменил свой код, включив в него то, что вы разместили выше, и теперь я получаю: TypeError: init() отсутствует 1 обязательный позиционный аргумент: 'parent'. Это происходит, когда я впервые ссылаюсь на модуль Receipt под декларацией if name == 'main': и настройкой app.exec_(). Любые идеи? - person jars121; 26.11.2013
comment
Ну, это говорит вам, что вам нужно передать «родительский»: т.е. window = MainWindow(); квитанция = квитанция (окно) - person ekhumoro; 26.11.2013
comment
Я попытался передать родителя, как вы предлагаете (см. редактирование выше), но теперь он возвращает повышенную ошибку TypeError. Еще раз спасибо за вашу помощь, это очень ценно! - person jars121; 26.11.2013
comment
Как я объяснил в своем ответе, вам нужно передать экземпляр, а не класс, то есть showReceipt = Receipt(showMainWindow). - person ekhumoro; 26.11.2013