Texte dans un label tkinter pas correctement mis à jour
RésoluFrewil -
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
- Texte dans un label tkinter pas correctement mis à jour
- Mise a jour chrome - Accueil - Applications & Logiciels
- Mise a jour windows 10 - Accueil - Mise à jour
- Votre appareil ne dispose pas des correctifs de qualité et de sécurité importants - Guide
- Mise a jour chromecast - Accueil - Guide TV et vidéo
- Mise à jour libre office - Accueil - Bureautique
2 réponses
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