Ab wann Klassenattribut nötig

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Freitag 13. Februar 2009, 10:08

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
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Freitag 13. Februar 2009, 14:23

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.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 13. Februar 2009, 16:36

Und Achtung, du meinst eigentlich wohl eher ``Instanzattribut`` und nicht ``Klassenattribut``.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten