Python variable ändern (erhöhen oder verringern)?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Deine Frage demonstriert, dass man Programmieren schrittweise lernen und nicht die Grundlagen überspringen sollte. ChatGPT nutzt dir auch nicht viel, wenn du nicht beurteilen kannst, ob der Code richtig ist.

Die Variable y ist in den Funktionen nicht fürs Schreiben sichtbar, wie du richtig bemerkt hast.

Jetzt hast du grob gesagt zwei Möglichkeiten:

  • Die nicht sehr schöne, aber "einfache": du machst diese globale Variable auch innerhalb der Funktionen beschreibbar. Das geht mit dem Schlüsselwort global.
  • Die korrekte. Bei solchen Callback-APIs gibt es praktisch immer die Möglichkeit, Benutzerdaten mitzugeben - eben genau damit man diese lesen und schreiben kann. Du siehst das ja auch in den Parameterlisten der Callbacks, da gibt es einen Parameter "userdata". Was da hineinkommt, bestimmst du selbst, siehe https://eclipse.dev/paho/files/paho.mqtt.python/html/client.html#paho.mqtt.client.Client.user_data_set - sinnvollerweise übergibt man da irgendeine Datenstruktur, die in sich veränderlich ist. Eine einfache Möglichkeit ist ein Dictionary, und da kannst du dann nach Herzenslust Werte ändern. Dieser Ansatz ist übrigens auch in der Einführung anhand eines Beispiels dokumentiert: https://pypi.org/project/paho-mqtt/#callbacks
y = int(1)
while y == 2:

Die Schleife kann gar nicht betreten werden, wenn y nie 2 wird, das ist ein offenkundiges Problem. Gibt es einen spezifischen Grund, warum Du y auf 1 anstatt 2 initialisierst?

Daß in Deinen Eventhandler y nicht geändert werden kann (wegen des Scopings) könnte man auch durch Nutzung einer Klasse lösen.

client = mqtt.Client()
client.username_pw_set( "userxxx" , "passwortxxx" )
client.connect( "192.16x.xxx.xxx", 1883, 60)
client.subscribe( "frame/monitor" , qos=1)
client.on_connect = on_connect
client.on_message = on_message
client.loop_forever()

Die Reihenfolge hier ist fehlerhaft.


Dyxen07 
Beitragsersteller
 24.03.2024, 23:47
Gibt es einen spezifischen Grund, warum Du y auf 1 anstatt 2 initialisierst?

Ja es gibt einen Grund, denn die Schleife soll nicht von Anfang an laufen, sondern soll sich aktivieren und deaktivieren. Also wenn ich den y Wert auf 2 setze sollte es sich aktivieren und zurück auf 1 soll diese Deaktiviert werden.

Die Reihenfolge hier ist fehlerhaft.

Was genau ist an der Reihenfolge fehlerhaft? Und wieso? Habe diese aus dem Internet übernommen aus einem anderen script, was den selben Ansatz folgt wie mein python Code.

KarlRanseierIII  25.03.2024, 04:19
@Dyxen07

Du führst erst einen connect aus, um danach den Callback für den erfolgten Connect zu registrieren, callbacks werden vorher registriert (siehe Doku).

Also, instanziieren, Callbacks registrieren, Nutzerdaten setzen, Verbindung herstellen.

Bezüglich des anderen Themas, Du willst eigentlich ein Synchronisierungsprimitiv nutzen auf das Deine Callbacks wirken.

Dubirne69  07.04.2024, 00:26

Aber in on_message wird es doch auf 2 (+1) gesetzt

KarlRanseierIII  07.04.2024, 01:53
@Dubirne69

Nur wird on_message eben nicht VOR der Schleife ausgeführt, sondern asynchron als Callback, irgendwann nachdem loop_forver() aufgerufen wurde.