web-dev-qa-db-fra.com

Mettre à jour l'étiquette Tkinter à partir d'une variable

J'ai écrit un script Python qui fait une tâche à générer, puis continue à changer du texte stocké en tant que variable de chaîne. Cela fonctionne, et je peux imprimer la chaîne à chaque fois qu'elle est modifiée.

Je peux obtenir l'étiquette pour afficher la chaîne pour la première fois, mais elle ne se met jamais à jour.

Voici mon code:

from tkinter import *

outputText = 'Ready'
counter = int(0)

root = Tk()
root.maxsize(400, 400)

var = StringVar()

l = Label(root, textvariable=var, anchor=NW, justify=LEFT, wraplength=398)
l.pack()

var.set(outputText)

while True:
    counter = counter + 1
    outputText = result
    outputText = result
    outputText = result
    if counter == 5:
        break

root.mainloop()

L'étiquette affichera Ready, mais ne se mettra pas à jour pour changer cela en chaînes car elles seront générées ultérieurement.

Après un peu de recherche sur Google et de recherche de réponses sur ce site, j'ai pensé que la solution pourrait être d'utiliser update_idletasks. J'ai essayé de mettre cela après chaque fois que la variable était modifiée, mais cela n'a pas aidé.

18
Tom

La fenêtre ne s'affiche qu'une fois la boucle principale entrée. Vous ne verrez donc aucune modification apportée dans votre bloc while True Précédant la ligne root.mainloop().


Les interfaces GUI fonctionnent en réagissant aux événements dans la boucle principale. Voici un exemple où le StringVar est également connecté à un widget d'entrée. Lorsque vous modifiez le texte dans le widget d'entrée, il change automatiquement dans l'étiquette.

from tkinter import *

root = Tk()
var = StringVar()
var.set('hello')

l = Label(root, textvariable = var)
l.pack()

t = Entry(root, textvariable = var)
t.pack()

root.mainloop() # the window is now displayed

J'aime la référence suivante: http://infohost.nmt.edu/tcc/help/pubs/tkinter/


Voici un exemple pratique de ce que vous essayez de faire:

from tkinter import *
from time import sleep

root = Tk()
var = StringVar()
var.set('hello')

l = Label(root, textvariable = var)
l.pack()

for i in range(6):
    sleep(1) # Need this to slow the changes down
    var.set('goodbye' if i%2 else 'hello')
    root.update_idletasks()

root.update Entrez la boucle d'événements jusqu'à ce que tous les événements en attente aient été traités par Tcl.

20
Gary Kerr

Peut-être que je ne comprends pas la question, mais voici ma solution simple qui fonctionne -

# I want to Display total heads bent this machine so I define a label -
TotalHeadsLabel3 = Label(leftFrame)
TotalHeadsLabel3.config(font=Helv12,fg='blue',text="Total heads " + str(TotalHeads))
TotalHeadsLabel3.pack(side=TOP)

# I update the int variable adding the quantity bent -
TotalHeads = TotalHeads + headQtyBent # update ready to write to file & display
TotalHeadsLabel3.config(text="Total Heads "+str(TotalHeads)) # update label with new qty

J'accepte que les étiquettes ne soient pas automatiquement mises à jour mais peuvent facilement être mises à jour avec le

<label name>.config(text="<new text>" + str(<variable name>))

Cela doit juste être inclus dans votre code après la mise à jour de la variable.

1
Brian Steinke