Обновление виджета ярлыка python / tkinter? - PullRequest
18 голосов
/ 17 декабря 2009

Я работаю над получением виджета ярлыка python / tkinter для обновления его содержимого. В более ранней теме сегодня я следовал инструкциям о том, как собрать виджеты. Однако во время выполнения виджет метки НЕ изменяет содержимое, а просто сохраняет его исходное содержимое. Насколько я могу судить, decment_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()

Ответы [ 3 ]

23 голосов
/ 17 декабря 2009

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

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

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

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

v.set("New Text!")
6 голосов
/ 17 декабря 2009

Я думаю, что вы получаете ошибку "ссылка перед присваиванием", потому что 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()
0 голосов
/ 06 января 2016
    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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...