Texte dans un label tkinter pas correctement mis à jour

Résolu/Fermé
Frewil - Modifié le 24 févr. 2023 à 03:26
 Frewil - 26 févr. 2023 à 11:42

Bonjour,

Dans l'extrait de code suivant, je rencontre le problème suivant. Lorsque le texte de label_chauff_6 se met à jour en fonction de plant_mode_reg, le nouveau texte se superpose à l'ancien. Je voudrais que ce dernier soit effacé avant que le nouveau soit affiché, mais je ne sais pas comment faire.

def mise_a_jour_donnees_modbus_tab_chauff_5s():

    datetime_object = datetime.datetime.now()
    date = datetime_object.strftime('%d/%m/%Y')
    heure = datetime_object.strftime("%H:%M:%S")

    # --------------- initialisation de la connexion Modbus -----------------
    print(Fore.LIGHTBLUE_EX + "********** Initialisation de la connection Modbus **********")
    print(Style.RESET_ALL)  # annuler le style de couleur du texte
    adresseIP = "192.168.0.11"
    c = ModbusClient()
    c.host = adresseIP
    c.port = 502
    if c.open():  # vérifie si la connection est active
        print(Fore.GREEN + "Connexion Modbus initialisée")
        print(Fore.GREEN + "Connecté à l'adresse IP ", adresseIP, "\n")
        print(Style.RESET_ALL)  # annuler le style de couleur du texte

        label_chauff_3 = ttk.Label(text="Connecté à l'adresse IP: " + adresseIP)
        label_chauff_3.config(foreground="olivedrab4", font="bold, 11")
        label_chauff_3.place(x=40, y=520)

        print(Fore.YELLOW + "le", date, "à", heure)
        print(Style.RESET_ALL)  # annuler le style de couleur du texte

        # Lecture du registre "Plant mode"
        plant_mode_dict = {0: "Off", 1: "Auto", 2: "Eau chaude sanitaire uniquement"}
        plant_mode_reg = c.read_holding_registers(3)

        if plant_mode_reg == 0:
            plant_mode_txt = plant_mode_dict[0]
        elif plant_mode_reg == [1]:
            plant_mode_txt = plant_mode_dict[1]
        elif plant_mode_reg == 2:
            plant_mode_txt = plant_mode_dict[2]
        else:
            plant_mode_txt = "Inconnu"

        print(plant_mode_txt)

        label_chauff_6 = ttk.Label(foreground="olivedrab4", font="bold, 11")
        label_chauff_6.configure(text=plant_mode_txt)
        label_chauff_6.place(x=550, y=390)


        c.close()

    else:
        print(Fore.RED + "Impossible de se connecter à l'adresse IP ", adresseIP)
        print(Fore.RED + "Code erreur: ", c.last_error_as_txt)
        print(Style.RESET_ALL)  # annuler le style de couleur du texte
        print("--" * 80)
        label_chauff_4 = ttk.Label(
            text=(
                "Impossible de se connecter à l'adresse IP: "
                + adresseIP
                + "\nVérifiez si la chaudière est connectée à internet \n"
                + "Vérifiez si l'adresse IP est valide"
            )
        )
        label_chauff_4.config(foreground="red", font="bold, 11")
        label_chauff_4.place(x=40, y=490)

    # etapes suivante
    window.after(5000, mise_a_jour_donnees_modbus_tab_chauff_5s)

Merci pour votre aide

A voir également:

2 réponses

mamiemando Messages postés 32948 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 février 2024 7 722
Modifié le 24 févr. 2023 à 03:38

Bonjour,

C'est parce que tu ne dois pas recréer le Label, tu dois simplement corriger le texte du label existant. Cet exemple illustre comment faire. Il y a probablement dans ta classe un problème de découpage.

# Import the required libraries
from tkinter import *

# Create an instance of tkinter frame or window
win = Tk()

# Set the size of the tkinter window
win.geometry("700x350")

# Define a function update the label text
def on_click():
   label["text"] = "Python"
   b["state"] = "disabled"

# Create a label widget
label = Label(win, text="Click the Button to update this Text", font=('Calibri 15 bold'))
label.pack(pady=20)

# Create a button to update the label widget
b = Button(win, text="Update Label", command=on_click)
b.pack(pady=20)

win.mainloop()

Une "bonne" application est généralement ainsi découpée (et ça tombe bien, c'est le cas de l'exemple cité) :

  • Son constructeur crée les widgets (boutons, labels, etc.) et installe les callbacks déclenchées en fonction des événements qui pourront survenir (par exemple si on appuie sur une touche du clavier, si on clique sur un bouton, etc.)
  • Ses méthodes implémentent ce qui doit être fait sur ces événements.
  • Puis on lance la boucle d'événement (win.mainloop()).

En admettant que tu corriges ton programme selon ce découpage, tu pourras alors modifier le texte du label ainsi :

label_chauff6["text"] = str(plant_mod_reg)

D'ailleurs, vu ton code, je pense que c'est plutôt plant_mod_txt que tu veux utiliser. Et tant qu'on y est, ligne 32, tu as visiblement mis des crochets en trop ([1] désigne la liste qui contient un élément, la valeur 1 ; c'est différent de l'entier qui vaut 1).

Mon conseil serait de ne pas tout coder d'un coup, mais de faire grossir petit à petit ton application en vérifiant à chaque étape que tout se passe comme prévu...

Bonne chance

1

Merci beaucoup pour ta réponse

0