pyserial - Problem beim anzeigen von Daten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
vmax80
User
Beiträge: 3
Registriert: Freitag 27. Februar 2009, 00:38
Wohnort: Schweiz

Montag 16. März 2009, 00:28

Guten Tag

Ich arbeite erst seit kurzem mit Python - bin also Anfänger.

Ueber die serielle Schnittstelle will ich Daten empfangen und in einem Windows Fenster sofort anzeigen. Dazu habe ich mir Folgendes kleines Prog. geschrieben.

Code: Alles auswählen

# empfangen1

import serial
from Tkinter import *
from decimal import *
import time
    

def empfangen():
    root.title('Daten empfangen ')
    evClear()
    ser = serial.Serial(port = 0, timeout = 1) 
    ser.baudrate = 38400
    a = 0
    ab=time.time()
    while a<10:
        if not ser.isOpen():
            break 
        messung = ser.read(50)
        if messung<> "":
            ab=time.time()
        else:
            a=time.time()-ab
        print len(messung) # nur zur Kontrolle im normalfall 50
        print messung       # auch nur zur Kontrolle
        textfenster.insert(END, messung)
        textfenster.pack()
 #  print "Verbindung unterbrochen" 
    ser.close()

def popupMenu(event):     
    popup.post(event.x_root, event.y_root) 

def ende():
    root.destroy()

def callback():
    print "Spaeter"

def evClear():
    textfenster.delete('1.0',END)
    
root = Tk()
textfenster = Text(root)
textfenster.pack(fill=BOTH,expand=YES)

# popup im textfenster
popup = Menu(textfenster,tearoff=0)
popup.add_command(label='Seite loeschen', command=evClear)    
popup.add_separator()
popup.add_command(label='Empfangen', command=empfangen)    
popup.add_separator()
popup.add_command(label='Speichern', command=callback)
popup.add_separator()
popup.add_command(label='Beenden', command=ende)    

textfenster.bind('<Button-3>',popupMenu)

mainloop()
Die Messungen (Daten) werden im Python Shell jeweils sofort nach 50 Zeichen angezeigt. Im Windows Fenster (textfenster) werden sie aber erst nach beenden der while Schlaufe augegeben.

Was mache ich falch resp. warum wird der String "messung" bei jedem Durchlauf im Python Shell gedruckt nicht aber im Windows Fenster?

Bin für jeden Hinweis dankbar!

Gruss vmax80


PS. Habe mein erster Beitrag ohne Titel gesendet - hoffe der Erste ist gelöscht!
BlackJack

Montag 16. März 2009, 08:24

@vmax80: Die `Tkinter`-Hauptschleife, die für die Aktualisierung der GUI zuständig ist, ruft die `empfangen()`-Funktion auf. Und solange diese nicht beendet ist, und damit wieder an die `Tkinter`-Hauptschleife abgibt, wird die GUI nicht aktualisiert.

Wenn man die GUI aktuell halten will und nebenbei noch etwas anderes tun möchte, wird es leider etwas kompliziert. In diesem Fall kämen dann Threads ins Spiel. Allerdings sind GUIs und Threads auch ein etwas hakeliges Thema. Das kann man häufig mit der `after()`-Methode auf `Tkinter`-Widgets umgehen, aber in diesem Fall eher nicht, weil die Aufrufe auf der seriellen Schnittstelle recht lange blockieren könnten.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Montag 16. März 2009, 14:02

Natürlich hat BlackJack recht. Ersetz aber einmal versuchsweise in Zeile 27 pack() durch update(). In einem meiner Programme funktionierte es damit (allerdings mit ScrolledText).
MfG
HWK
vmax80
User
Beiträge: 3
Registriert: Freitag 27. Februar 2009, 00:38
Wohnort: Schweiz

Montag 16. März 2009, 20:07

Vielen Dank an BlackJack und HWK für die raschen Antworten die Erklärungen und den guten Typ mit dem .update() an Stelle von .pack()! Mit .update() werden bei jedem Durchlauf in der while Schlaufe die Daten sofort angezeigt. Schon wieder etwas dazugelehrnt.

Gruss vmax80
Antworten