Gtk.MessageDialog Fenster schließt nicht

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
BastelRalf
User
Beiträge: 1
Registriert: Sonntag 3. März 2019, 20:10

Hallo ihr lieben,

ich habe mir ein kleines Skript zusammengeschrieben, dass einen GTK.MessageDialog öffnet, wenn ein gewisser Status eingetreten ist.

Dieser Status wird über mqtt.subscribe abgefragt. Das ganze klappt auch super, nur lässt sich das die Dialogbox nicht mehr schließen; nur wenn das Programm abgebrochen wird.
sehr wahrscheinlich liegt das am "loop_forever()";

Da ich aber ganz neu in der Python-Szene bin - stehe ICH vor einem unlösbaren Rätsel. Vielleicht könnt ihr helfen: die Dialogbox soll aufpoppen und wenn ich das gelesen habe und OK gedrückt habe, soll die wieder verschwinden - das Programm läuft weiter, bis der nächste "offline" da ist.

Lieben Dank
~Ralf~

Hier noch der Code:

Code: Alles auswählen

import paho.mqtt.client as mqtt 
import ssl
import time
from gi.repository import Gtk

def on_connect( client, userdata, flags , rc):
        print("Connected mit Code: " +str(rc))
        client.subscribe("serverschrank/status")

def on_message( client, userdata, msg):
        print (str(msg.payload))
        if str(msg.payload) == "offline" : 
            dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Der ESP ist off$
            dialog.format_secondary_text("schnell wieder anschalten!!")
            dialog.run()

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("**host**", 8883, 60)
client.username_pw_set("**user**","**pass**")
client.tls_set("/**path**/ca.crt", tls_version=ssl.PROTOCOL_TLSv1_2)
client.loop_forever()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Grundsaetzlich liegst du mit deiner Vermutung richtig. Leider benutze ich kein GTK, darum kann ich nur ungefaehr helfen - vielleicht findet sich ja hier wer anders, der sich da besser auskennt.

Deine MQTT-Bibliothek ist schonmal mainloop-integrations-faehig. Ein Beispiel fuer einen select-loop findet sich hier:

https://github.com/eclipse/paho.mqtt.py ... _select.py

Daraus kann man ablesen, dass

- jede Sekunde do_misc aufgerufen werden muss.
- man den Socket bekommt, und den muss man in GTK reinfummeln, um IO-Events (lesen, schreiben) zu bekommen. Das scheint ueber IOChannel zu gehen:

https://lazka.github.io/pgi-docs/#GLib- ... l.unix_new

Aber das ist recht komplex, da kann ggf. wer anderes ein funktionierendes Beispiel bauen.
Antworten