2013-11-25 3 views
2

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

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

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 для подобных запросов, но не нашел ничего подходящего.

Спасибо!

EDIT:

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

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

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

ответ

4

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

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

Это позволит затем Службе использовать parent method для доступа к экземпляру MainWindow и его атрибутам. Конечно, это означает Квитанция должен всегда иметь 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) 
+0

Спасибо за то ekhumoro, что на самом деле имеет больше смысла. Я изменил свой код, чтобы включить то, что вы разместили выше, и теперь я получаю: TypeError: __init() __ отсутствует 1 обязательный позиционный аргумент: 'parent'. Это происходит, когда я сначала ссылаюсь на модуль Receipt при настройке if __name__ == '__main__': declaration и app.exec_(). Есть идеи? – jars121

+1

Ну, это говорит вам, что вам нужно передать «родительский»: то есть окно = MainWindow(); receipt = Receipt (window) – ekhumoro

+0

Я пробовал передать родителя, как вы предлагаете (см. выше), но теперь он возвращает поднятый TypeError. Еще раз спасибо за вашу помощь, это очень ценится! – jars121

Смежные вопросы