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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jens P. (Firma: Bei mir und dir.) (gravewarrior)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (Firma: Bei mir und dir.) (gravewarrior)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.