Python tkinter Widget update #after?
Hallo,
ich lese mit dem folgenden Skript die Temperatur eines DS18B20 an meinem Raspberry aus. Der Wert wird beim ausführen der GUI-Python-Sktipr auch korrekt ausgelesen und angezeigt... jedoch komme ich mit "after" nicht klar - Sprich: die ausgelesene Temperatur aktualisiert sich nicht... kann mir jemand sagen wo der Fehler liegt?
Die After-Funktion bei der Zeit funktioniert... die Sekunden laufen sauber mit...
Temperatur-Messung Aquarium
# Temperatur am Sensor auslesen
sensor = '/sys/bus/w1/devices/28-021313a6e3aa/w1_slave'
def temp_read():
file = open(sensor, "r")
lines = file.readlines()
file.close()
return lines
def celsius_read():
lines = temp_read()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = temp_read()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
temp_c = round(temp_c,1)
temp_c = str(temp_c) + '°C'
return temp_c
temp = StringVar()
temp.set(celsius_read())
temp_label = Label(window, textvariable=temp, font='arial 120', bg='black', fg='lightblue')
temp_label.pack(side='top', fill='x', pady='80')
temp_label.after(1000,celsius_read)
1 Antwort
Hallo,
ich habe von Python 0 Ahnung, aber wenn das so ist wie in Tcl/Tk, musst du in der Funktion celsius_read die gebundene Variable "temp" auch neu setzen, damit der den Wert im Label updated (oder den Text über temp_label.configure direkt setzen, dann braucht es aber keine gebundene Variable).
Die Definition muss wahrscheinlich an den Anfang und das temp.set() vor das return in die Funktion, ggfs. zusätzlich, zur Initialisierung kann es ja unten bleiben. Wenn ich das richtig interpretiere, wird die jetzt Funktion zwar ausgeführt, aber eben die Textanzeige nicht neu gesetzt...
Danke für deine Antwort.
also beim ausführen bekomme ich keinen Fehler angezeigt.
Die Funktion/Methode mit *after* habe ich in dem selben Skript mit der Uhrzeit genutzt um diese "live" anzeigen zu lassen (refresh 5x die Sekunde)
müsste ich für deine Lösung (#temp neu setzen) nur die *temp* und temp.set()* einen Tab nach rechts einrücken damit diese einfach zur Funktion gehören?