Tkinter und pyserial

Fragen zu Tkinter.
Antworten
frisei
User
Beiträge: 9
Registriert: Montag 8. April 2013, 14:20

Hallo Python-Forum
Thema: pyserial und Tkinter XP
Habe ein Tkinter-Programm mit pyserial und threading
welches Mess-Daten von einem mikroProcessor empfängt.
Das geht im Prinzip, aber ist unglaublich langsam.
Baudrate 38400, 8 N 1 COM1 als "richtigen" RS232
Bemerkung:
das bei pyserial-Paket beiliegende miniterm.py
reagiert zeitnah, aber nur in der Py-Shell.
bei miniterm.py unter Idle kommen nur komische
Zeichen und es geht nicht mehr normal zu beenden.
Zu allem Unglück ist die belegte Comx verhunzt und muss umständlich entsperrt werden !
Zum testen habe ich auf dem uP ein Befehl,
welcher 65535 mal die 4stellige Hexzahl mit ; als Trenner sendet.
das von mir benutzt HTerm, welches ich als gut empfand, schaffte diesen Test
auch nicht, es verschluckte am Ende zu Zeichen und blieb hängen.
Nun zum Problem:
Der Messvorgang wird mit einem gesendeten Char vom PC
gestartet und ist vom uP in ca 1 Sekunde erledigt
es sendet ca. 2000 zeichen,
das Py+Tk programm braucht dazu fast 20 sec .
Die einzelnen Zeichen kriechen förmlich auf dem Bildschirm und die Pixel
auf dem Canvas-Fenster kann man fast einzeln beobachten
Das ganze wird mit jedem Messzyklus noch langsamer.
Frage:
Gibt es eine Möglichkeit, in der "TK".mainloop() etwas "unterzubringen"?
So wie die einzelnen Buttons und Entrys und die Maus usw. dauernd abgefragt
werden (eben die mainloop), könnte man doch "pyserial.inWaiting()" auch abfragen und
entsprechend reagieren.

gruss
bastler
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Zeig doch mal ein wenig Code zu deinem Problem. Am besten ein minimales Lauffähiges Beispiel, welches den Fehler reproduziert.

Ich hatte es gestern in einem anderen Thread schon geschrieben: Höre doch bitte mit den ganzen unnötigen Zeilenumbrüchen auf. Und dann lässt du sich nach tatsächlich Absätzen auch noch weg. Das kann man doch nicht vernünftig lesen. Ich, bzw. mein Browser, möchte selber entscheiden, wie der Text für mich ideal formatiert ist. Bei deiner Formatierung war ich mehr damit beschäftigt aus den Zeilen Sätze zu bilden, als den Inhalt zu verstehen.
Das Leben ist wie ein Tennisball.
BlackJack

@bastler: Ich denke es sind zwei unterschiedliche Probleme hier. Das eine hast Du ja selbst identifiziert: Wie kann man regelmässig etwas in der GUI aktualisieren. Dazu gibt es die `after()`-Methode auf Widgets. Da kann man eine Funktion/Methode und eine Verzögerung angeben und nach der angegebenen Verzögerung wird die Funktion von der Tk-Hauptschleife aufgerufen. Die kann dann etwas machen und sich selbst wieder zum Aufruf über `after()` „eintragen”. Üblicherweise würde man im Thread Daten für die Anzeige in eine `Queue.Queue` schreiben, und die dann in dieser Funktion für `after()` auslesen und anzeigen.

Das zweite Problem, rate ich jetzt einfach mal so, ist dass Du einen `Canvas` nicht als Vektorgrafik behandelst und da immer mehr und mehr Objekte zeichnest. Darum wird das immer langsamer, weil das eben keine Pixelgrafik ist sondern bei jedem aktualisieren dort immer alles was jemals gezeichnet wurde wieder neu gezeichnet wird. Also auch alles was mittlerweile vielleicht schon von anderen Objekten verdeckt wird.

Ergänzend zu EyDu wegen den Zeilenumbrüchen: Ich hatte eben das umgekehrte Problem beim Lesen auf dem Smartphone. Da war nicht viel unnötiger Platz rechts von Text sondern Deine Zeilenumbrüche haben für einen „Kammeffekt” gesorgt, es gab immer abwechselnd eine Zeile über die gesamte Breite und in der nächsten Zeile ein bis zwei Worte und dann einen störenden Umbruch.
Antworten