使用 StringVar 的跟踪条目对标签没有影响

Tracing Entry that uses a StringVar has no effect on Label

学习使用 Tkinter 并遵循在线教程。这是一个输入文本的示例,然后标签将相应地更新到输入文本字段。

我在 Python3、Mac 和 Raspberry Pi 中尝试了它,但我没有看到跟踪的效果,因此标签没有被修改入口。任何帮助将不胜感激(或任何其他如何一起使用 Entry 和 Trace 的简单示例)

谢谢。

from tkinter import *

class HelloWorld:

    def __init__(self, master):
      frame = Frame(master)
      frame.pack()
      self.button = Button(
            frame, text="Hello", command=self.button_pressed
            )
      self.button.pack(side=LEFT, padx=5)

      self.label = Label(frame, text="This is a label")
      self.label.pack()

      a_var = StringVar()
      a_var.trace("w", self.var_changed)
      self.entry = Entry(frame,textvariable=a_var)
      self.entry.pack()

    def button_pressed(self):
      self.label.config(text="I've been pressed!")

    def var_changed(self, a, b, c):
      self.label.config(text=self.entry.get())


def main():
  root = Tk()
  root.geometry("250x150+300+300")
  ex = HelloWorld(root)
  root.mainloop()  

if __name__ == '__main__':
    main()  

问题是您正在为 a_var 使用局部变量,而在 Mac 上它正在变得 garbage-collected。保存对变量的引用(例如:self.a_var 而不仅仅是 a_var)。

  self.a_var = StringVar()
  self.a_var.trace("w", self.var_changed)
  self.entry = Entry(frame,textvariable=self.a_var)
  self.entry.pack()

注意:如果您只想保持标签和条目同步,则不需要使用跟踪。你可以 link 他们给他们相同的 textvariable:

self.entry = Entry(frame, textvariable=self.a_var)
self.label = Label(frame, textvariable=self.a_var)