什么时候使用变量类? (BooleanVar, DoubleVar, IntVar, StringVar)

When to use Variable classes? (BooleanVar, DoubleVar, IntVar, StringVar)

不能tkinter.widget.configure(text="our text")用于所有小部件吗?有什么好处,或者使用的主要目的:

var_cls = tkinter.StringVar()
tkinter.widget.configure(textvariable=var_cls)

是不是 var_cls 可以更容易地在 methods/classes 等人之间共享?


带有变量的示例 class:

import tkinter as tk
root = tk.Tk()
var = tk.StringVar(value="This will be on the label.")
tk.Label(root, textvariable=var).pack()
root.mainloop()

没有变量的示例 class:

import tkinter as tk
root = tk.Tk()
tk.Label(root, text="This will be on the label.").pack()
root.mainloop()

StringVar可以绑定到一个widget,所以你只需要在StringVar上有句柄,你可以修改它的值,它会自动更新。否则,您将需要保留小部件本身的句柄并处理事件循环等。基本上,当值可能更改时,您应该使用 StringVar 等。如果它肯定是静态的,你不需要它。

在 tkinter 应用程序中,很少需要 StringVar(以及 IntVarBooleanVarDoubleVar)。底层 tcl/tk 解释器为其所有变量提供特殊功能,因此存在这些包装器以利用这些功能。

这些变量的两大优点是:

  1. 您可以将一个变量关联到多个小部件,以便两个或多个小部件始终显示完全相同的信息
  2. 您可以绑定值更改时要调用的函数。

我的意见是,除非您特别需要这两个功能之一,否则不应使用它们。如果您只需要获取或设置小部件的值,则有一些方法可以在小部件本身上执行此操作(例如:entry_widget.insert(...)、label_widget.configure(text='...' ), ETC)。

我觉得它们通过引入需要管理的额外对象来增加开销,除非您利用上述两个功能,否则不会提供任何额外的好处。

StringVar 对于更新例如非常有用。值更改时的标签。您可以提取其内容并转换为 float/integer 并稍后用于计算。它也可以使用 .set 方法更新,然后不需要在 window/other 容器中更新值,因为它会自动发生。虽然转换为“可理解的”变量类型存在一些困难,但仍然值得。