使用 StringVar()、trace() 和 Entry() 的 Tkinter 问题

Problem with Tkinter using StringVar(), trace() and Entry()

我正在定义一个 StringVar() 并给它一个值,然后将其用作 Entry 小部件的 textvariable。我还向 StringVar 添加了跟踪,以便我可以将其用作占位符检查器,并使占位符的颜色与键入的文本不同。

然而,当我 运行 输入小部件的代码不包含文本时,但是如果我打印 StringVar() 的值,它会给出正确的值。此外,永远不会调用跟踪命令,当我打印 Entry 小部件的 textvariable 的值时,它显示为 PY_VAR#.

有谁知道为什么这不起作用以及如何解决它?

circleVarEmailAddress = StringVar()
circleVarEmailAddress.set("email address")
circletextEmailAddress = Entry(forgottenWindow, textvariable = circleVarEmailAddress,
                               font = 10, relief = "raised", highlightbackground = "black",
                               borderwidth = 2, fg = "#808080")
circletextEmailAddress.place(x = 75, y = 100, width = 250, height = 50)

def placeholderEmailAddress(a, b, c):
  print("Hey")
  for i in range(1, 13):
    if("email address"[:i] in circleVarEmailAddress.get() == True and
       "email address"[i:] in circleVarEmailAddress.get() == True):
      index1 = circleVarEmailAddress.get().index("email address"[:i])
      index2 = circleVarEmailAddress.get().index("email address"[i:])
      circleVarEmailAddress.set(circleVarEmailAddress.get()[:index1] +
                                circleVarEmailAddress.get()[index1 + i:index2] +
                                circleVarEmailAddress.get()[index2 + 13 - i:])
  if(circleVarEmailAddress.get() != "email address" and
     "email address" in circleVarEmailAddress.get() == True):
    circleVarEmailAddress.set(circleVarEmailAddress.get().replace("email address", ""))
  if circleVarEmailAddress.get() == "":
    circleVarEmailAddress.set("email address")
  if circleVarEmailAddress.get() == "email address":
    circletextEmailAddress.config(fg = "#808080")
  else:
    circletextEmailAddress.config(fg = "#000000")

circleVarEmailAddress.trace_add("write", placeholderEmailAddress)

如果我添加一些样板,你的代码对我来说运行良好。

我根据变量名“forgottenWindow”假设这是您程序中的新 window。如果您使用 Tk() 进行附加 windows,就会出现您看到的问题。始终使用 Toplevel 创造超越第一个的新 windows。

forgottenWindow = Toplevel()