Funktion mit Rückgabewert mit PyQt5

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Hallo,

ich würde gerne in einem mit pyqt5 erstellten Fenster eine Funktion ausführen, die zu einem Wert jeweils +2 dazuaddiert. Das ganze soll per Buttonklick erfolgen.
Also der Code soll etwa so aussehen:

Code: Alles auswählen

def Addiere(n):
	return n+2

app = PyQt5.QtWidgets.QApplication(sys.argv)
fenster = PyQt5.uic.loadUi("hauptfenster.ui")
fenster.show()

wert = 1
wert= fenster.Button1.clicked.connect(Addiere(wert))
sys.exit(app.exec_())
Ich erhalte die Meldung, dass int irgendwie unerwartet sei. Die Funktion funktioniert aber soweit - auf Kommandozeilenbasis läuft das. Wie könnte ich das Problem lösen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast den Rückgabewert deiner Funktion als Signal Versucht zu benutzen. Das ist ein int. Daher die Fehlermeldung.

Um das erstmal zum laufen zu bringen benötigst du entweder ein lambda oder functools.partial.

Danach hast du dann natürlich immer noch das Problem, das ein Rückgabewert in einem clicked slot natürlich völlig sinnlos ist. Wo soll der denn enden?

Aus diesem Grund Programmierert man GUIs objektorientiert, weil man dann solche Ergebnisse zb an Labels binden kann oder in Datenstrukturen speichern etc - ohne dabei auf die Pest globale Variablen zurückgreifen zu müssen.
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Naja ich möchte den Rückgabewert als Index für eine Liste benutzen.

Mit den lambda Funktion hatte ich folgendes probiert, bekam aber auch eine Fehlermeldung:

Code: Alles auswählen

fenster.Button1.clicked.connect(lambda: wert = wert +2
lambda cannot contain assignment sagt er mir da.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Kann es nicht. So sind lambdas nunmal. Nochmal: statt hier mit globalen Variablen rumzufuhrwerken, schreib eine Klasse, und dann kannst du ganz simpel eine Methode schreiben in der du deinen Wert berechnest und auf Listen zugreifst und was auch immer dein Herz begehrt.
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Ok, dann danke ich dir soweit erstmal. Dann habe ich heute noch was zu tun - mein Quellcode ist bereits mehrere Seiten lang. Aber ich sehe ein, dass globale Variablen kein guter Stil sind.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Cortez: Kann es sein, dass das hier eigentlich immer noch das Thema ist: PyQt5: mit pushButton-Klick Schleife weiterlaufen lassen?

Selbst wenn eine Zuweisung in einem ``lambda``-Ausdrück möglich wäre, dann würde Dir das ja nichts nützen weil `wert` dann ein lokaler Name in der Funktion wäre und da die nächste Fehlermeldung käme weil Du versuchst auf den Wert zuzugreifen bevor er definiert wurde.

Wenn das als Index in eine Liste verwendet werden soll, warum dann mit 1 initialisieren und immer 2 addieren? Du hast da hoffentlich keine Liste erstellt in der jedes zweite Element etwas anderes bedeutet als sein Vorgänger‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten