Aggiornamento dinamico widget in TKINTER

di il
0 risposte

Aggiornamento dinamico widget in TKINTER

Buon giorno a tutti,

Sono nuovo utente del forum, essenzialmente mi occupo di hardware e da poco sto procedendo da autodidatta all'apprendimento del linguaggio Phyton per sviluppare script per Raspberry PI, sinora ho sempre utilizzato linguaggi tipo VisualBasic.

Per un'applicazione in cui controllo diversi sensori collegati al Raspberry ho realizzato uno script Python che legge ed aggiorna i valori dei diversi sensori riportandoli su alcune etichette di una interfaccia grafica realizzata con tkinter. 

L'interfaccia grafica è costituita da un Button “START” e da diverse Label per raccogliere i valori letti dai vari sensori. 

Cliccando su “START” nella routine relativa oltre a diverse azioni di configurazione e settaggi vari vengono letti sequenzialmente i valori di una ventina di sensori analogici e scritti nelle Label relative ai vari sensori.

Il problema che riscontro è che le label vengono aggiornate solo al termine della routine di gestione del button START quando rientra nel mainloop, quindi lo script, per quanto riguarda il controllo e la lettura dei valori dei sensori funziona correttamente, e al termine ho la situazione aggiornata dei valori, purtroppo siccome la lettura dei sensori richiede un certo tempo circa 20 sec  si ha la sensazione che una volta cliccato START non accade nulla per 20 sec ( a volta anche di più perchè alcuni sensori possono avere tempi di risposta più lunghi).

Per fare qualche verifica ho scritto uno script molto leggero che riporto di seguito (lo script di produzione con tutta la parte di gestione dei sensori è molto pesante ) :

import time
import tkinter as tk
from tkinter import ttk

def StartMain():
    for i in range(10):
        time.sleep(1)
        lbl01.config(text=i)
        print(i)
    
def ResMain():
            lbl01.config(text="")

mainw = tk.Tk()
mainw.title("SyncLBL")
mainw.geometry("500x100+400+300")
mainw.resizable(False, False)

lbl01 = ttk.Label(text="",borderwidth=5, relief="ridge")
lbl01.grid(column=3, row=1,sticky="EW",padx=5,pady=2,ipadx=50, ipady=5)

StartButton=ttk.Button(text="START",command=StartMain)
StartButton.grid(column=0,row=3,sticky="EW",padx=5,pady=2,ipadx=50, ipady=5)

ResButton=ttk.Button(text="RESET",command=ResMain)
ResButton.grid(column=5,row=3,sticky="EW",padx=5,pady=2,ipadx=50, ipady=5)
mainw.mainloop()

Nel momento in cui clicco sul Button START nella consolle vedo incrementare ogni secondo il conteggio mentre la label dell'interfaccia viene aggiornata solo al termine della routine START con l'ultimo valore di conteggio . 

Non sono riuscito a trovare niente che mi aiuti a risolvere, potreste darmi una mano in modo da vedere aggiornata la label man mano che il conteggio prosegue?

Grazie e saluti a tutti

PS. Come anticipato sono un autodidatta e non ho alcuna esperienza nella programmazione ad oggetti

Devi accedere o registrarti per scrivere nel forum
0 risposte