Я работаю над тем, чтобы заставлять виджет маркировки python/tkinter обновить его содержание. На более ранний поток сегодня, я следовал инструкциям о том, как соединить виджеты. Во времени выполнения, однако, виджет маркировки НЕ изменяет содержание, но просто сохраняет его исходное содержание. Насколько я могу сказать, decrement_widget () никогда не называется вообще. Какие-либо идеи?
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()
Вы захотите установить текстовую переменную
метки с помощью StringVar
; когда StringVar
изменяется (вы вызываете myStringVar.set («текст здесь»)
), то текст метки также обновляется. И да, я согласен, это странный способ делать что-то.
См. книгу Tkinter для получения дополнительной информации об этом:
Вы можете связать переменную Tkinter с меткой. Когда содержимое переменной изменяется, метка обновляется автоматически:
v = StringVar () Метка (мастер, текстовая переменная = v) .pack () v.set ("Новый текст!")
I think you're getting a "referenced before assignment" error because Python thinks remaining
is in the local scope.
In Python 3, you can say nonlocal remaining
. But in Python 2, I don't believe there's a way to refer to a non-local, non-global scope. This worked for me:
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()