Seite 1 von 1

Objekt aus einer anderen Def heraus ansprechen

Verfasst: Montag 9. Juli 2018, 10:59
von Ulrich_G
Hallo,

habe noch Probleme Objekte aus jeder def heraus anzusprechen.

Code: Alles auswählen

class SMCTool(QWidget):
    def __init__(self, filename, title, parent=None):
        QWidget.__init__(self, parent)
        uic.loadUi('frame.ui', self)
        
        pixmap = QPixmap('.\images\SMC_komplett_AUS.jpg')
        self.status_txt.setPixmap(pixmap)
        self.status_txt.show()
will ich das Image nun aus einer anderen def heraus ändern gibt es Probleme:
NameError: name 'self' is not defined

Code: Alles auswählen

def func_COM3():
    pixmap = QPixmap('.\images\SMC_komplett.jpg')
    self.status_txt.setPixmap(pixmap)
    self.status_txt.show()
Könnte mir jemanden helfen bzw auch erklären warum das so einfach nicht möglich ist?

Re: Objekt aus einer anderen Def heraus ansprechen

Verfasst: Montag 9. Juli 2018, 11:11
von __deets__
Na das ist ja auch eine frei stehende Funktion. Die hat keinen Zustand. Und self bezeichnet das Objekt einer Methode, so wie this in Java, C#, C++ etc.

Das ist auch garantiert in VB nicht anders. Wenn du “func_COM3” (übrigens sehr schlecht benannt. Das es eine Funktion ist, ist eh klar. Und das es COM3 ist nur Zufall) auf status_txt zugreifen lassen willst, muss es Methode von SMCTool werden, und natürlich einen self Parameter bekommen.

Re: Objekt aus einer anderen Def heraus ansprechen

Verfasst: Montag 9. Juli 2018, 11:21
von __blackjack__
Naja der Name `self` ist halt nicht definiert. Wo sollte der denn Deiner Meinung nach herkommen? Bei der `__init__()` wird `self` ja als Argument an die Methode übergeben. Ist `func_COM3()` eine Funktion? Falls ja, sollte es vielleicht auch eine Methode auf `SMCTool` sein‽ Und vielleicht möchte man die Dateien nicht jedes mal neu laden, sondern nur einmal in der `__init__()`.

Was ist denn `status_txt` für ein Datentyp? `QIcon`\s kennen mehrere Zustände und für jeden Zustand kann man ein anderes Bild hinterlegen. Man müsste das dann aber in ein vorhandenes Widget einbauen welches einen On/Off-Zustand kennt (Buttons, beispielsweise) oder sich selber eine Klasse dafür schreiben. Wenn man das mit einem Label darstellt, würde ich aber auch da eine eigene Klasse schreiben, die das ganze kapselt.