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
Tkinter und threads
@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.
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.
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
Das verwendet man so wie's in der Doku steht:
Was genau ist daran denn jetzt unkar? Suchfunktion hier im Forum sollte auch ein paar Beispiele zu Tage fördern.
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.
Wenn du noch ein Beispiel für die after() Methode brauchst, schau hier:
http://www.python-forum.de/topic-18806.html
http://www.python-forum.de/topic-18806.html
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?
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?