gui und thread parallel

Fragen zu Tkinter.
Antworten
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

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
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

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
Antworten