Je travaille sur un widget python/tkinter label pour mettre à jour son contenu. Par un fil précédent aujourd'hui, j'ai suivi les instructions sur la façon de rassembler les widgets. Au moment de l'exécution, toutefois, le widget étiquette NE modifie PAS le contenu, mais conserve simplement son contenu d'origine. Autant que je sache, decrement_widget () n'est jamais appelé. Des idées?
def snooze (secs):
"""
Snoozes for the given number of seconds. During the snooze, a progress
dialog is launched notifying the
"""
root = Tkinter.Tk()
Prompt = 'hello'
label1 = Tkinter.Label(root, text=Prompt, width=len(Prompt))
label1.pack()
remaining = secs
def decrement_label ():
text = "Snoozing %d sec(s)" % remaining
remaining -= 1
label1.config(text=text, width=100)
label1.update_idletasks()
for i in range(1, secs + 1):
root.after(i * 1000, decrement_label )
root.after((i+1) * 1000, lambda : root.destroy())
root.mainloop()
Vous voudrez définir la variable textvariable
de l'étiquette avec un StringVar
; Lorsque la StringVar
change (lorsque vous appelez myStringVar.set("text here")
), le texte de l'étiquette est également mis à jour. Et oui, je suis d’accord, c’est une façon étrange de faire les choses.
Voir le livre Tkinter pour un peu plus d'informations à ce sujet:
Vous pouvez associer une variable Tkinter à une étiquette. Lorsque le contenu de la variable change, l’étiquette est automatiquement mise à jour:
v = StringVar() Label(master, textvariable=v).pack() v.set("New Text!")
Je pense que vous obtenez une erreur "référencée avant affectation" car Python pense que remaining
est dans la portée locale.
En Python 3, vous pouvez dire nonlocal remaining
. Mais dans Python 2, je ne pense pas qu'il soit possible de faire référence à une portée non locale, non globale. Cela a fonctionné pour moi:
remaining = 0
def snooze (secs):
"""
Snoozes for the given number of seconds. During the snooze, a progress
dialog is launched notifying the
"""
global remaining
root = Tkinter.Tk()
Prompt = 'hello'
label1 = Tkinter.Label(root, text=Prompt, width=len(Prompt))
label1.pack()
remaining = secs
def decrement_label ():
global remaining
text = "Snoozing %d sec(s)" % remaining
remaining -= 1
label1.config(text=text, width=100)
label1.update_idletasks()
for i in range(1, secs + 1):
root.after(i * 1000, decrement_label )
root.after((i+1) * 1000, lambda : root.destroy())
root.mainloop()
import tkinter
from tkinter import *
# just init some vars
remaining = 0
secs = 0
root = tkinter.Tk()
Prompt = StringVar()
def snooze (secs):
"""
Snoozes for the given number of seconds. During the snooze, a progress
dialog is launched notifying the
"""
def decrement_label ():
global remaining, Prompt
remaining -= 1
Prompt.set('Snoozing %d sec(s)' % remaining)
label1.update_idletasks()
if not remaining:
print("end ... ")
root.destroy()
global remaining
Prompt.set("hello")
label1 = tkinter.Label(root, textvariable=Prompt, width=30)
label1.pack()
remaining = secs
for i in range(1, secs + 1):
root.after(i * 1000, decrement_label )
snooze(10)
root.mainloop()