web-dev-qa-db-fra.com

Faire la mise à jour du widget python/tkinter label?

Je travaille sur un widget python/tkinter label pour mettre à jour son contenu. Par un fil précédent aujourd'hui, j'ai suivi les instructions sur la façon de rassembler les widgets. Au moment de l'exécution, toutefois, le widget étiquette NE modifie PAS le contenu, mais conserve simplement son contenu d'origine. Autant que je sache, decrement_widget () n'est jamais appelé. Des idées?

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()
17
Stephen Gross

Vous voudrez définir la variable textvariable de l'étiquette avec un StringVar ; Lorsque la StringVar change (lorsque vous appelez myStringVar.set("text here")), le texte de l'étiquette est également mis à jour. Et oui, je suis d’accord, c’est une façon étrange de faire les choses.

Voir le livre Tkinter pour un peu plus d'informations à ce sujet:

Vous pouvez associer une variable Tkinter à une étiquette. Lorsque le contenu de la variable change, l’étiquette est automatiquement mise à jour:

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

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

Je pense que vous obtenez une erreur "référencée avant affectation" car Python pense que remaining est dans la portée locale.

En Python 3, vous pouvez dire nonlocal remaining. Mais dans Python 2, je ne pense pas qu'il soit possible de faire référence à une portée non locale, non globale. Cela a fonctionné pour moi:

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()
6
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