ich möchte gerne in einem tkinter-Label eine Temperatur anzeigen, die z.B. jede Sekunde erneuert wird. Zunächst habe ich noch nicht die Funktion verwendet, welche die Daten vom Temperatursensor einliest, sondern die Zufallszahlenfunktion genommen.
In anderen Beiträgen habt ihr mich vor Threads gewarnt. In diesem Beispiel http://www.python-forum.de/viewtopic.php?f=1&t=34497 habe ich mit Eurer Hilfe die after-Methode kennengelernt. Die after-Methode scheidet aber in diesem Fall für mich aus, da in dem Beispiel in dem Link eine Funktion immer rekursiv neu aufgerufen wird, aber angenommen, ich lese die Daten über mehrere Tage aus und schreibe die Werte z.B. auch später noch in eine Datenbank, dann würde der Speicher als mit mehr Funktionen voll werden und es irgendwann vom Interpreter wegen Speicherüberlaufs zum Abbruch kommen. Darum habe ich mich jetzt erstmal wieder für einen Thread entschieden.
Ich würde gerne mein Beispielprogramm zur Diskussion in dieses Forum reinstellen und würde mich sehr freuen, wenn ihr mir vielleicht weitere Tipps oder andere Möglichkeiten aufzeigen könntet, wie ich das noch lösen könnte.
Code: Alles auswählen
try:
import tkinter as tkinter
except:
import Tkinter as tkinter
import random
import time
from threading import Thread
from functools import partial
class Hole_zyklisch_Daten():
def __init__(self, data_obj=tkinter.Label, zeitintervall=1):
self.__zeitintervall = zeitintervall
self.__thread_state = False
self.__data_obj = data_obj
self.__thread_obj = Thread()
self.__data = 0.
def start_thread(self):
if self.__thread_state == False:
self.__thread_state=True
self.__thread_obj = Thread(target=self.__thread_function)
self.__thread_obj.start()
def stop_thread(self):
self.__thread_state=False
self.__thread_obj.join()
def __thread_function(self):
while self.__thread_state == True:
# Hier Funktion, um die Daten aus dem Temperaturmodul zu holen:
# self.__data_obj.set(str(random.random() ))
self.__data_obj.config(text=str(random.random ()))
print ("in thread_schleife")
time.sleep(self.__zeitintervall)
def main():
root = tkinter.Tk()
label=tkinter.Label(root, text="nix")
hole_daten = Hole_zyklisch_Daten(label)
hole_daten.start_thread()
label.pack()
root.mainloop()
hole_daten.stop_thread()
if __name__ == "__main__":
main()