Seite 1 von 1

gui und thread parallel

Verfasst: Mittwoch 10. Februar 2010, 11:07
von draufunddran
Hallo Leute,

bin bei meinem Programm jetzt auf ein neues Problem gestoßen. ich erklär jetzt erstmal was mein Programm soll:

Das Programm soll nachdem man auf einen "START" button geklickt hat auf zwei USB-Ports Daten einlesen (GPS-Daten). Diese dann verarbeiten und natürlich auf der GUI ausgeben.

Bis jetzt hat in der Conosole alles prima funktioniert, nur weis ich jetzt nicht weiter wie ich das mit der GUI mache, ich müsste ja auf jedenfall einen Thread für das einlesen erstellen, da ja tkinter die ganze zeit in der Mainloop hängt.

Ich habe bis jetzt eine gps klasse und eine gui klasse (instantz der gui heist app). Die gps klasse läuft in einem eigenen thread und soll mit alle 500 ms mit der afterfunktion die gui aktualisieren, aber irgendwie kann ich nicht auf das label schreiben.

Code: Alles auswählen

app.label2["text"] = 'test'
TypeError: 'NoneType' object does not support item assignment
gibts da ne eleganter lösung?

greetz draufunddran

Re: gui und thread parallel

Verfasst: Mittwoch 10. Februar 2010, 15:22
von numerix
draufunddran hat geschrieben:aber irgendwie kann ich nicht auf das label schreiben.

Code: Alles auswählen

app.label2["text"] = 'test'
TypeError: 'NoneType' object does not support item assignment
gibts da ne eleganter lösung?
Du kannst den Label-Text nicht ändern, weil label2 keine Label-Instanz ist. Da du den Code nicht zeigst, rate ich mal, dass irgendwo etwa folgende Zeile steht:

Code: Alles auswählen

self.label2 = Tkinter.Label(self.root, text="irgendwas").pack()
Da ein Aufruf von pack() None zurückliefert, erhältst du so keine Label-Instanz, sondern None ...

Verfasst: Mittwoch 10. Februar 2010, 17:33
von dahaze
Hallo!

Am Einfachsten ists wohl, wenn du den angezeigten Text direkt an eine Tkinter-Variable hängst...
Ganz quick'n dirty:

Code: Alles auswählen

import Tkinter
import threading
import time

root = Tkinter.Tk()
textvar = Tkinter.StringVar()
Tkinter.Label(root, textvariable=textvar).grid()

def func(var):
  for i in xrange(10):
    var.set(i)
    time.sleep(0.5)

th = threading.Thread(target=lambda :func(textvar))
th.start()

root.mainloop()
Falls du allerdings umfangreichere Ausgaben aus einem Thread auf die GUI durchführen willst, empfehle ich dir auf jeden Fall dies über eine Queue zu realisieren.
Wenn du nämlich aus einem Thread auf die GUI arbeitest und der Mainloop der GUI "trifft" sich mit der Ausgabe eines Threads, wars das... :roll:

Hierzu ist dieser Link zu empfehlen:
http://effbot.org/zone/tkinter-threads.htm

Gruß,
Simon

Verfasst: Donnerstag 11. Februar 2010, 13:03
von draufunddran
Danke euch beiden das obige Problem hab ich behoben mit einer tkinter-variable und das mit tkinter und den threads schau ich mir jetzt gleich mal an.

danke draufunddran