Tkinter / Serial readline / Threading in python

Gast #5351732
Lesenswert?

Hi alle,

ich erstelle gerade mit Python3 eine Anwendung, die unter anderem auf 
Befehle per UART reagieren soll, aber auch ein Tkinter-GUI hat.

Recht schnell bin ich bei thread.Threading gelandet. Den Thread zu 
starten klappt nun auch.

Nun ist aber meine Frage: Wie bekomme ich die Daten  Flags  Events / 
Wasauchimmer wieder in den GUI-Root-Thread?

Bei einer Konsolenanwendung könnte ich ja einfach globale Variablen 
setzen und Pollen (wie beim Interrupt aufm µC), aber wenn der GUI-Loop 
erst mal läuft, komme ich ja an nichts dran.

Ich müsste also irgendein Event auslösen können, auf dass dann im 
Hauptthread reagiert werden kann (Ähnlich zu den binds bei Button 
press/release).

genau hier hänge ich nun. Wie wird das üblicherweise realisiert?

Mein Thread schaut so aus:
1
class SerialReceiveThread(threading.Thread):
2
  def __init__(self):
3
    threading.Thread.__init__(self)
4
  def run(self):
5
      print ("Thread gestartet ")
6
      pressMuteMicro()
7
      while (True):
8
        print("Schleife gestartet ")
9
        if (SerialPort.inWaiting()>0):
10
            line = SerialPort.readline()
11
            if line == "Schaff was, faul Sau!":
12
               print ("Receive Pwr ON ")
13
               BildschirmAn()
14
            elif line == "Mach Feierowend!":
15
               print ("Receive Pwr OFF ")
16
               BildschirmAus()

pressMuteMicro(), BildschirmAn() und BildschirmAus sind Funktionen aus 
dem Hauptthread. Ich hatte ja insgeheim gehofft, dass es bei Python so 
einfach geht, aber tut es natürlich nicht.

Der Thread wird wie folgt gestartet:
1
ReadThread = SerialReceiveThread()
2
ReadThread.start()
3
guiRoot.mainloop()

So langsam raucht mir der Kopf, ich würde mich über ein paar Stichworte 
sehr freuen.

Beste Grüße
Jens
Gast #5352474
Lesenswert?

Hi und Danke für eure Antworten.

Also scheint es keine Variante zu geben, mit der direkt ein Event 
ausgelöst wird.

Da ich nur flags setzen muss (um eine von vier verschiedenen Funktionen 
im UI-Thread auszuführen) ist das mit der qeue ja fast schon Overkill.

Wenn ich es richtig verstehe, kann ich mit "after" also einen Timer 
realisieren. Da es beim Rückweg nur um Relais für Licht und Jalousie 
geht, ist es zeitlich unkritisch und mir reichen 4 kleine Flags. Ich 
werde dann mal in diese Richtung weiterarbeiten.

Besten Dank

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren