Tkinter und threads

Fragen zu Tkinter.
Antworten
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

Hi,
ich habe ein Programm mit einer GUI und innerhalb dieser GUI eine Endlosschleife, welche Netzwerkdaten auswertet.
Bis jetzt hatte ich das mit Threads gelöst, was aber ab und zu zum Absturz von python führt.
Gibt es außer Threads noch eine andere Möglichkeit mainloop und diese endlosschleife parallel auszuführen?
mfg
daniels7
BlackJack

@daniels7: Die `after()`-Methode auf `Tkinter`-Widgets.

Wenn Du an der bestehenden Architektur nicht zu viel ändern möchtest, kannst Du auch weiterhin Threads verwenden, nur dürfen die nicht auf die GUI zugreifen. Eine Möglichkeit wäre zum Beispiel die Ergebnisse des Threads in eine `Queue.Queue` zu stecken und diese dann mit `after()` regelmässig abzufragen, um die GUI zu aktualisieren.
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

kannst du mal bitte etwas genauer erläutern wie man after() anwendet, ich kenn mich damit noch nicht so aus. Und entschuldigung das ich das Programm hier nicht poste, aber ich glaube es würde den Rahmen leicht sprengen
BlackJack

Das verwendet man so wie's in der Doku steht:

Code: Alles auswählen

In [188]: tk.Widget.after?
Type:           instancemethod
Base Class:     <type 'instancemethod'>
String Form:    <unbound method Widget.after>
Namespace:      Interactive
File:           /home/bj/lib-tk/Tkinter.py
Definition:     tk.Widget.after(self, ms, func=None, *args)
Docstring:
    Call function once after given time.

    MS specifies the time in milliseconds. FUNC gives the
    function which shall be called. Additional parameters
    are given as parameters to the function call.  Return
    identifier to cancel scheduling with after_cancel.
Was genau ist daran denn jetzt unkar? Suchfunktion hier im Forum sollte auch ein paar Beispiele zu Tage fördern.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Wenn du noch ein Beispiel für die after() Methode brauchst, schau hier:
http://www.python-forum.de/topic-18806.html
MReed
User
Beiträge: 1
Registriert: Sonntag 17. Mai 2009, 16:06

Verstehe ich das jetzt richtig:
Der thread wird weiterhin normal gestartet, dieser bekommt vom Netzwerk Daten, packt diese mittels 'Queue.Queue.put(data)' und 'Queue.Queue.join()' in ein Threadsicheren Bereich der dann von der GUI mittels 'Queue.Queue.get()' nach 'root.after(some_time)' ausgelesen wird?
Antworten