web-dev-qa-db-ja.com

python / tkinterラベルウィジェットを更新しますか?

その内容を更新する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()
18
Stephen Gross

ラベルのtextvariableStringVar で設定する必要があります。 StringVarが変更されると(myStringVar.set("text here")を呼び出すことにより)、ラベルのテキストも更新されます。そして、はい、同意します。これは、奇妙な方法です。

これに関する詳細については、 Tkinter Book を参照してください。

Tkinter変数をラベルに関連付けることができます。変数の内容が変更されると、ラベルが自動的に更新されます。

v = StringVar()
Label(master, textvariable=v).pack()

v.set("New Text!")
25
Mark Rushakoff

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()
7
Fred Larson
    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()
0
bertil