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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.