Seite 1 von 1

[gelöst] Slot mit Argumenten

Verfasst: Freitag 2. Oktober 2009, 19:03
von newhippie
hallo, ich bin ganz frisch in die Gilde der Python Programmieren (wohl bemerkt, als x-tes Hobby) und habe schon eine erste Frage an die Erfahrenen.

Ich möchte mit PyQt GUI Anwendungen schreiben und bin gerade am Erlernen der Vorgehensweise. Ein wenig was habe ich schon auf die Beine gestellt, sowas wie Text anzeigen und Text auslesen, Schließen und lauter solche Kleinigkeiten.

Jetzt möchte ich folgendes erreichen:

Code: Alles auswählen

    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)
        ...
        nam = "./txt/log.txt"
        var = self.read_file(nam)
        self.connect(self.btSave, QtCore.SIGNAL("clicked()"), self.write_file(nam, var))
       ...
    def list_entry(self, dicti):
       ....
Also, ausformuliert könnte es heißen, ich möchte eine Funktion mit Argumenten starten, wenn der Button gedrückt wird.

Nur leider meldet Eric4 in dieser Form:
"argument 3 of QObject.connect() has an invalid type"

Wie kann ich mir behelfen? Ich habe schon einiges gelesen, aber immer nur ohne Argumente hinten.

Danke schon mal...

Verfasst: Freitag 2. Oktober 2009, 19:22
von cofi
Zu allererst: Das geht so nicht, weil ein Funktionsobjekt erwartet wird, an der Stelle rufst du aber die Funktion auf und ``connect`` kann mit dem Rueckgabewert, der kein Funktionsobjekt ist, nichts anfangen.

Die Loesung ist `functools.partial` zu verwenden: [mod]functools[/mod]

Verfasst: Freitag 2. Oktober 2009, 19:31
von newhippie
Erstmal danke für die Blitzantwort.

Hab den Link angeschaut, aber ich werde nicht richtig schlau draus, wie ich so eine "partial" nun anwenden soll.

und im Endeffekt muss ich sie trotzden mit Parametern aufrufen, oder?

Vielleicht kannst du ja ein kleines Beispiel mit connect hinschmieren...

Verfasst: Freitag 2. Oktober 2009, 19:57
von cofi
newhippie hat geschrieben:und im Endeffekt muss ich sie trotzden mit Parametern aufrufen, oder?
Ja sicher, Telepathie kann der Python-Interpreter noch nicht. `partial` erzeugt allerdings ein neues Funktionsobjekt, das schon die Parameter enthaelt.

Code: Alles auswählen

partial_write = partial(self.write_file, nam, var)
self.connect(self.btSave, QtCore.SIGNAL("clicked()"), partial_write)

Verfasst: Freitag 2. Oktober 2009, 20:15
von newhippie
Wunderbar, danke viele Male.

So kann auch verstehen, was gemeint ist )) (diese *args usw. verwirren am Anfang ein wenig.

Funktioniert jetzt.