[gelöst] Slot mit Argumenten

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

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...
Zuletzt geändert von newhippie am Freitag 2. Oktober 2009, 20:16, insgesamt 1-mal geändert.
Es kann nur ein Monopol geben: Linux.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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]
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

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...
Es kann nur ein Monopol geben: Linux.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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)
Zuletzt geändert von cofi am Freitag 2. Oktober 2009, 20:24, insgesamt 1-mal geändert.
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

Wunderbar, danke viele Male.

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

Funktioniert jetzt.
Es kann nur ein Monopol geben: Linux.
Antworten