Seite 1 von 1

Gtk.MessageDialog Fenster schließt nicht

Verfasst: Sonntag 3. März 2019, 20:20
von BastelRalf
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()

Re: Gtk.MessageDialog Fenster schließt nicht

Verfasst: Sonntag 3. März 2019, 22:23
von __deets__
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.