Anfänger braucht Hilfe bei PyQt4

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
niederrheiner
User
Beiträge: 30
Registriert: Montag 7. Januar 2013, 11:52

Hallo an Alle,
ich habe folgendes Problem: in einem Fenster befinden sich zwei Frames mit jeweils einem Button. Nach Start der Anwendung sollen beide Frames nicht angezeigt werden. Erst durch Auswahl in der Menüleiste (Menüpunkt <Rezepte><Eingabe>) soll ein Frame angezeigt werden.
Nach Start der Anwendung wird auch ein leeres Fenster angezeigt. Wenn ich aber den besagten Menüpunkt auswähle erscheint die folgende Fehlermeldung:

Code: Alles auswählen

  File "/home/guenter/Projekte/python/testframe/testframe/mainframe.py", line 53, in slotEingabe
    self.dlg_testfr.frame1.show()
AttributeError: 'mainframe' object has no attribute 'dlg_testfr'
Mein Programm sieht wie folgt aus:

Code: Alles auswählen

# Imports
import sys
from PyQt4 import QtGui, uic, QtCore
# from myModules import dlg_center

class mainframe(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)        
        dlg_testfr = uic.loadUi("testframe.ui", self)

        
        dlg_testfr.pbClose.clicked.connect(self.slotClose)  
        dlg_testfr.frame1.hide()  
        dlg_testfr.frame2.hide()

        self.makeActions()
        self.makeMenu()
        self.show()
 
    def makeActions(self):
        self._exitAction = QtGui.QAction("&Ende", None)
        self._helpAction = QtGui.QAction("Hilfe!", None)
        self._inputAction = QtGui.QAction("Eingabe", None)
        self.connect(self._exitAction, QtCore.SIGNAL('triggered()'), self.slotClose)
        self.connect(self._helpAction, QtCore.SIGNAL('triggered()'), self.slotHelp)
        self.connect(self._inputAction, QtCore.SIGNAL('triggered()'), self.slotEingabe)   
 
    def makeMenu(self):
        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu("&Datei")
        fileMenu.addAction(self._exitAction)
        
        workMenu = menuBar.addMenu("&Rezepte")
        workMenu.addAction(self._inputAction) 
               
        helpMenu = menuBar.addMenu("&Hilfe")
        helpMenu.addAction(self._helpAction)
        
    # Slots        
 
    def slotClose(self):
        self.close()
 
    def slotHelp(self):
        QtGui.QMessageBox.information(None, "Dies ist die Hilfe", "Hilf dir selbst, sonst hilft dir keiner!")   
        
    def slotEingabe(self):
        self.dlg_testfr.frame1.show()
         
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog = mainframe()
    dialog.show()
    sys.exit(app.exec_())
Wo denke ich in die falsche Richtung?
Danke für Eure Hilfe und Tipps

Bis dann ...
MfG
Günter
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@niederrheiner: in Deiner __init__ erzeugst Du ja auch nur eine lokale Variable 'dlg_testfr' und kein Attribut 'self.dlg_testfr'.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Um die Antwort etwas zu auszubauen, sei auch erklärt was genau Sirius3 meint.
Deine Variable dlg_testfr ist nur innerhalb des Konstruktors verfügbar/"sichtbar", daher muss deine Methode slotEingabe letztendlich fehlschlagen.

Dort sprichst du nämlich korrekterweise

Code: Alles auswählen

self.dlg_testfr.frame1
an, allerdings besitzt self respektive die aktuelle Instanz von mainframe diese Variable nicht. Instanzvariablen müssen im Konstruktor immer entsprechend deklariert werden. Daher ändere die Deklaration so wie es Sirius angegeben hat und es wird funktionieren.
BlackJack

@Madmartigan: Also wenn wir schon genau sind, sollten wir nicht von Deklarationen sprechen sondern von Definitionen, oder halt wie Sirius3 vom erzeugen des Attributs. :-)
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Mein Beitrag war ergänzend gemeint, nicht kritisierend!

Auch wenn ich keine type-Deklarationen in Python vornehme, sehe ich die erste "Bekanntgabe" einer Variable dennoch als ihre Deklaration an. Dass sie gleichzeitig definiert wird, halte ich nun nicht zwingend für ein Argument gegen diese Bezeichnung. (Wir können das gern offline diskutieren, in diesem Thread wäre das vielleicht unvorteilhaft.)
BlackJack

@Madmartigan: Deklaration hat bei Programmiersprachen eigentlich eine festgelegte Bedeutung als etwas was dem Compiler Informationen über bestimmte Namen bekannt macht. In Python gibt es wenige Deklarationen, aber es gibt halt welche, darum sollte man IMHO den Begriff passend verwenden. Deklarationen wären beispielsweise ``global``, ``nonlocal``, und einige `__future__`-Importe.
niederrheiner
User
Beiträge: 30
Registriert: Montag 7. Januar 2013, 11:52

danke an Alle, die mir geantwortet haben. Kleiner Fehler, große Wirkung.
Jetzt klappt es wie ich mir vorgestellt habe.

Nochmals Danke.

Bis dann ...
MfG
Günter
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

BlackJack hat geschrieben:@Madmartigan: Deklaration hat bei Programmiersprachen eigentlich eine festgelegte Bedeutung als etwas was dem Compiler Informationen über bestimmte Namen bekannt macht. In Python gibt es wenige Deklarationen, aber es gibt halt welche, darum sollte man IMHO den Begriff passend verwenden. Deklarationen wären beispielsweise ``global``, ``nonlocal``, und einige `__future__`-Importe.
Ja, du hast recht, Letzteres klingt plausibel.
Antworten