Signal-Slot-Problem [Anfänger]

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
hanuman
User
Beiträge: 2
Registriert: Donnerstag 29. März 2012, 14:51

Hej,

nachdem ich nun schon die Forensuche bemüht habe & dabei leider nicht fündig werden konnte, habe ich mich hier angemeldet & möchte Euch um Hilfe bei der Lösung meines Problems bitten. Meine bisherigen Programmiererfahrungen beschränken sich auf ein bisschen Delphi vor Jahren im Studium. Das ging damals ganz gut & hat sogar Spaß gemacht!

Das Problem ist ziemlich simpel. Ein Fenster enthält je einen Button (QPushButton) & ein Edit-Feld (QLineEdit). Durch Drücken des Buttons soll die vorher in das Edit-Feld eingegebene Zeichenfolge im Konsolenfenster ausgegeben werden.

Code: Alles auswählen

from PyQt4 import QtCore
from PyQt4 import QtGui

class Fenster(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        
        self.setWindowTitle('Fenster')
        self.setGeometry(400, 400, 250, 150)
        
        edit1 = QtGui.QLineEdit()

        button1 = QtGui.QPushButton('Drucken')
        button1.clicked.connect(self.bclick)
 
        layout = QtGui.QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(edit1)

        main_frame = QtGui.QWidget()
        main_frame.setLayout(layout)

        self.setCentralWidget(main_frame)

    def bclick(self, edit):
        edit = QtGui.QLineEdit(self)
        text = edit.text()
        print text

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    form = Fenster()
    form.show()
    app.exec_()
Nach meinem Verständnis wäre die Verknüpfung dieser beiden Aktionen (Button drücken, Text ausgeben) mit Signal-Slot umzusetzen. Leider gelingt mir das aber nicht. Im besten(?) Fall kriege ich zwar keine Fehlermeldung, aber es tut sich auch sonst nichts. Ich verstehe einfach, wie ich der Methode bclick begreiflich machen kann, dass sie sich den Text aus dem Edit-Feld holen soll. Und aus den verfügbaren Tutorials werde ich irgendwie nicht schlau...

Ich bin für jeden konstruktiven Beitrag dankbar!

Besten Gruß.
lunar

@hanuman: In "bclick()" erzeugst dort ein vollkommen neues "QLineEdit", was so ziemlich das Gegenteil von dem ist, was Du eigentlich möchtest. Du musst das in "__init__()" erzeugte "QLineEdit"-Objekt an ein Exemplarattribut binden, und in "bclick()" dann auf dieses Attribut zugreifen. Wenn Dir diese Begriffe nichts sagen, oder Du diesen Satz nicht in konkreten Code umzusetzen vermagst, dann fehlt es Dir an essentiellen Python-Grundlagen. Arbeite in diesem Fall das offizielle Tutorial durch, und zwar mindestens bis Kapitel 9. Ohne diese Grundlagen kannst Du keine Programme mit graphischer Oberfläche entwickeln.
hanuman
User
Beiträge: 2
Registriert: Donnerstag 29. März 2012, 14:51

Hey lunar,

vielen Dank für Deine Antwort! Bisschen ernüchternd, muss ich sagen, aber Du hast ganz sicher recht. Ich habe mir gerade das Tutorial geschnappt und werde es durcharbeiten.

Besten Gruß!
MrVirus
User
Beiträge: 8
Registriert: Samstag 25. Februar 2012, 12:31

Naja, ich arbeite jetzt seit ca 6 Jahren mit Python und habe das Wort "Exemplarattribut" noch nie gehört. Ob mir deswegen grundlegende Pythonkenntnisse fehlen wage ich mal zu bezweifeln...

Trotzdem hat Lunar Recht. Man erkennt an deinem Code, dass du das Prinzip der objektorientierten Programmierung nicht wirklich verstanden hast. Da ist es nicht besonders günstig, mit einem objektorientierten GUI Framework anzufangen. Die Lektüre des Tutorials ist sicher nicht verkehrt!
print "Hello, World!"
lunar

@MrVirus: „Exemplarattribut“ ist die deutsche Übersetzung des englischen Begriffs „instance attribute“, der bereits im Tutorial, Abschnitt 9.3.3. Instance objects benutzt wird. Nach sechs Jahren mit Python muss Dir wenigstens der englische Begriff geläufig sein, und der Transfer zum deutschen Begriff sollte keine unmögliche Herausforderung mehr darstellen :)
MrVirus
User
Beiträge: 8
Registriert: Samstag 25. Februar 2012, 12:31

Ich übersetze "instance" eher mit "Instanz", ist ab hier aber auch Haarspalterei ;)

Attribut ist mir da eher geläufig
print "Hello, World!"
lunar

@MrVirus: Um das Haar mal zu spalten: Diese Übersetzung ist zwar gebräuchlich, aber eigentlich einfach nur falsch. „Instanz“ hat eine ganz andere Bedeutung. :)
Dragonfire
User
Beiträge: 22
Registriert: Dienstag 28. Februar 2012, 09:03

Namen sind doch Schall und Rauch ...

Ich hätte es jetzt Objektfeld oder Objektdatenfeld genannt, bzw. Objektvariable ...
oder spricht da etwas gegen?

Dann gibt es noch lokale Variablen, die hier verwendet wurden ...
und Klassenvariablen (Instanzvariable ist deswegen ein wenig irreführend, da man damit auch Klassenvariablen meinen könnte ...)

Bei python heißen die wieder ganz anders ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Dragonfire: Mir erschließt sich der Sinn Deines Beitrags nicht. Erst stellst Du einen Bezug zur vorherigen Diskussion her, dann stellst Du selber den Bezug zu Python in Deinem letzten Satz in Frage... kommt mir reichlich verworren vor.

Ich finde den Suffix "feld" bzw "datenfeld" wenig eingehend. Was ist denn ein "Feld"? Und wieso das ganze durch "Daten" einschränken? Wieso nicht einfach bei der gängigen Nomenklatur bleiben?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dragonfire
User
Beiträge: 22
Registriert: Dienstag 28. Februar 2012, 09:03

Hyperion hat geschrieben:@Dragonfire: Mir erschließt sich der Sinn Deines Beitrags nicht. Erst stellst Du einen Bezug zur vorherigen Diskussion her, dann stellst Du selber den Bezug zu Python in Deinem letzten Satz in Frage... kommt mir reichlich verworren vor.
Ist mir auch bewusst geworden ...
Deswegen gibt es ein neuen Thread ...

http://www.python-forum.de/viewtopic.php?f=1&t=29032

Was ist ein Attribute?
Wo liegen denn die Unterschiede zu einem Feld?
Wer hat das definiert?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi hanuman

So sollte es gehen:

Code: Alles auswählen

from PyQt4 import QtCore
from PyQt4 import QtGui

class Fenster(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QWidget.__init__(self)
       
        self.setWindowTitle('Fenster')
        self.setGeometry(400, 400, 250, 150)
       
        self.edit1 = QtGui.QLineEdit(self)

        button1 = QtGui.QPushButton('Drucken')
        button1.clicked.connect(self.bclick)

        layout = QtGui.QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(self.edit1)

        main_frame = QtGui.QWidget()
        main_frame.setLayout(layout)

        self.setCentralWidget(main_frame)

    def bclick(self):
        text = self.edit1.text()
        print text

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    form = Fenster()
    form.show()
    app.exec_()
Gruß wuf :wink:
Take it easy Mates!
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Hi hanuman,

noch eine kurze Anmerkung. Lies am besten nochmal genau nach was ein Objekt, was Attribute und was Methoden sind. Gerade wenn es um Oberflächen geht, kann man Objekte und vor allem die Konstruktion der selben, als sehr sehr bildlich begreifen. Denn dort ist es als würdest du jemanden eine Anleitung schreiben, wie er dein Fenster "zeichnen" soll. Die Methoden (bclick) sind dann auch wirklich die Dinge, die dieses Objekt, sprich Fenster machen kann. ;)

Mir hat das sehr gut geholfen, mir das so bildlich vorzustellen.

AlphaX2
Antworten