Обновление показаний температуры в графическом интерфейсе tkinter

Я новичок в Python & tkinter, но у меня есть базовый графический интерфейс, который просто отображает температуру, считываемую из GPIO. Единственная вещь, которую я не могу заставить работать - температура не обновляется.

Если кто-то может помочь, это было бы здорово.

Благодарю.

#!/usr/bin/env python3

from tkinter import *
from tkinter import ttk
from tkinter import font
import time
import glob
import os

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def quit(*args):
    root.destroy()

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.after(0.1)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = round(float(temp_string) / 1000.0,3)
        return temp_c
    root.after(1000, read_temp) 

root = Tk()
root.attributes("-fullscreen", True)
root.configure(background='black')
root.bind("<Escape>", quit)
root.bind("x", quit)

fnt = font.Font(family='Helvetica', size=300, weight='bold')
txt = StringVar()
txt.set(read_temp())
lbl = ttk.Label(root, textvariable=txt, font=fnt, foreground="white", background="black")
lbl.place(relx=0.5, rely=0.5, anchor=CENTER)

root.after(1000, read_temp)

root.mainloop()

1 ответ

Для того, чтобы обновить метку температуры lbl с показаниями температуры и установкой ее цвета в зависимости от температуры вам необходимо:

1. создавать стили (как вы использовали ttk.Label ) для цветов

style = ttk.Style()
style.configure('Blue.TLabel',  foreground='blue')
style.configure('Green.TLabel', foreground='green')
style.configure('Red.TLabel',   foreground='red')

поставить кодовый блок перед созданием метки температуры

2. удалить foreground настройка при инициализации метки температуры

lbl = ttk.Label(root, textvariable=txt, font=fnt, background="black")

3. обновить метку температуры внутри read_temp()

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.after(0.1)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = round(float(temp_string) / 1000.0,3)
        # update temperature label
        txt.set(f'{temp_c:.3f} °C')
        # set its color based on temperature reading
        style = 'Blue.TLabel' if temp_c < 23 else 'Red.TLabel' if temp_c > 28 else 'Green.TLabel'
        lbl.config(style=style)
    root.after(1000, read_temp) 
Другие вопросы по тегам