その内容を更新する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()
ラベルのtextvariable
を StringVar
で設定する必要があります。 StringVar
が変更されると(myStringVar.set("text here")
を呼び出すことにより)、ラベルのテキストも更新されます。そして、はい、同意します。これは、奇妙な方法です。
これに関する詳細については、 Tkinter Book を参照してください。
Tkinter変数をラベルに関連付けることができます。変数の内容が変更されると、ラベルが自動的に更新されます。
v = StringVar() Label(master, textvariable=v).pack() v.set("New Text!")
Pythonはremaining
がローカルスコープにあると考えているため、「割り当て前に参照されました」エラーが発生していると思います。
Python 3では、nonlocal remaining
。しかし、Python 2では、非ローカル、非グローバルスコープを参照する方法はないと思います。これは私にとってはうまくいきました:
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()