Seite 1 von 1

Ab wann Klassenattribut nötig

Verfasst: Freitag 13. Februar 2009, 10:08
von feldmaus
HI Leute,

mein Programm gibt mir eine Fehlermeldung rauß:
unhandled AttributeError "imgLabel"

Soweit meine Lektüre das hergibt, könnte es sich um ein
nicht zu findendes Attribut handeln. Bin mir
aber nicht ganz sicher, ob es auch ein andere Fehler
sein könnte.

Ich habe <imgLabel> in der Klassen-Methode
<__init__(self, parent=None)> definiert und beziehe
mich in der Klassen-Methode <scaleImage(self, factor)>
auf dieses Attribut.

Muss ich <imgLabel> als Klassen-Attribut definieren?
Und wenn, wie sollte ich es als Klassen-Attribut definieren?

Was wird in der Regel als Klassen-Attribut defniert und was
wird in Klassen-Methoden definiert ?

Z.b. benötige ich das Attribut <scalefactor> in mehreren
Methoden.

Hier ein Code-Schnipsel:

Code: Alles auswählen

    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
...

        self.scrollArea = QScrollArea()
        self.imgLabel = QLabel()
        self.image = QImage("./media/images/aventurien.jpg")
        self.imgLabel.setBackgroundRole(QPalette.Dark)
        self.imgLabel.setScaledContents(True)
        self.imgLabel.setPixmap(QPixmap.fromImage(self.image))
        self.scrollArea.setWidget(self.imgLabel)
        self.scrollArea.setBackgroundRole(QPalette.Dark)
        self.setCentralWidget(self.scrollArea)
...


    def scaleImage(self, factor):
        assert self.imgLabel.pixmap() is not None
        self.scalefactor *= factor
        self.imgLabel.resize(scalefactor * self.imgLabel.pixmap().size())
        self.adjustScrollBar(self.scrollArea.horizontalScrollBar(), factor)
        self.adjustScrollBar(self.scrollArea.verticalScrollBar(), factor)
        self.zoomInAct.setEnabled(scaleFactor < 3.0)
        self.zoomOutAct.setEnabled(scaleFactor > 0.333)
... 
Grüße Markus

Verfasst: Freitag 13. Februar 2009, 14:23
von cofi
Was kein Klassenattribut ist, ist eine lokale Variable zu der Funktion in der sie definiert ist. Dh machst du dein imgLabel lokal, kannst du es außerhalb der Initialisierung nicht mehr ändern, bzw allgemein darauf zu greifen (wobei man das in dem Fall bestimmt kann, da (Py)Qt Referenzen hält, aber davon sollte man sich gedanklich gaaaanz weit entfernen ;) )

Zu deinem scalefactor: Wenn das wirklich ein Attribut ist, dass du abseits einer Funktion brauchst, ja. Wenn das aber nur zum skalieren nötig ist, ist es wohl sinnvoller, das als Parameter deiner Funktion zu setzen. Aber da kann man mit dem Schnipselchen nicht viel sagen ....

Zu deinem assert: Das würde ich austauschen gegen eine Messagebox mit Fehlermeldung und dann die Funktion beenden. Wenn du aber das Widget/die Aktion, das/die die Funktion auslöst deaktivieren kannst, macht das mehr Sinn das auch zu deaktivieren, wenn du kein Bild hast. Ein Assert bringt aber keine Informationen für den User. Schon gar nich ein unbehandelter.

Verfasst: Freitag 13. Februar 2009, 16:36
von Leonidas
Und Achtung, du meinst eigentlich wohl eher ``Instanzattribut`` und nicht ``Klassenattribut``.