24

我正在努力获取一个 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()
4

5 回答 5

39

您需要textvariable使用StringVar;设置标签 当StringVar更改(通过调用myStringVar.set("text here"))时,标签的文本也会更新。是的,我同意,这是一种奇怪的做事方式。

有关这方面的更多信息,请参阅Tkinter Book :

您可以将 Tkinter 变量与标签相关联。当变量的内容发生变化时,标签会自动更新:

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

v.set("New Text!")
于 2009-12-16T21:54:29.963 回答
9

我认为您收到“分配前引用”错误,因为 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()
于 2009-12-16T22:37:34.513 回答
1

要更新标签中的文本,您可以尝试以下操作:

from tkinter import *

root = Tk()
root.title("Title")
root.geometry('300x300')


def clear_text(self):
    txtE.delete(0, 'end')


def new_label(event=None):
    Entree = txtE.get()
    lbl1['text'] = Entree.title()
    clear_text(txtE)


lbl1 = Label(root, text='Hello There')
lbl1.pack()
txtE = Entry(root)
txtE.focus()
txtE.pack()

Button(root, text='Enter', command=new_label).pack()
Button(root, text='Quit', command=root.destroy).pack(side=BOTTOM)
root.bind('<Return>', new_label)
root.mainloop()
于 2020-01-03T18:21:45.757 回答
0
    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()
于 2016-01-06T12:30:31.670 回答
0

我认为你必须调用snooze(secs)函数

之后,如果您的代码再次不起作用,请尝试此操作

设置变量

Variable = StringVar()

在标签小部件中,您可以将“textvariable”参数设置为上述“变量”。

例如: label1 = Label(root,textvariable = Variable).pack()

您可以通过将新值设置为“变量”来更新

例如:Variable.set("hi")

希望你明白了!!!

于 2020-08-08T16:32:05.597 回答