Создание 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
задан meagar 7 November 2011 в 13:46
поделиться

2 ответа

Вы захотите установить текстовую переменную метки с помощью StringVar ; когда StringVar изменяется (вы вызываете myStringVar.set («текст здесь») ), то текст метки также обновляется. И да, я согласен, это странный способ делать что-то.

См. книгу Tkinter для получения дополнительной информации об этом:

Вы можете связать переменную Tkinter с меткой. Когда содержимое переменной изменяется, метка обновляется автоматически:

 v = StringVar ()
Метка (мастер, текстовая переменная = v) .pack ()

v.set ("Новый текст!")
27
ответ дан 30 November 2019 в 07:33
поделиться

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()
8
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: