Forum: PC-Programmierung Tkinter / Serial readline / Threading in python


von Jens P. (Gast)


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

von Possetitjel (Gast)


Lesenswert?

Jens P. schrieb:

> 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.

Wieso? Gibt's kein "after"?

von M.K. B. (mkbit)


Lesenswert?

Ich kann jetzt auf die schnelle nicht sagen, ob das hier die optimale 
Lösung ist, aber anschauen schadet ja nicht.

https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch09s07.html

von Jens P. (Gast)


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

von Nico W. (nico_w)


Lesenswert?

Wenn du mit threading arbeitest müsstest du irgendwann mal hierauf 
stoßen.


https://docs.python.org/3/library/threading.html


Unter 17.1.7 solltest du dein Event finden.

LG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.