【问题标题】:When to use Variable classes? (BooleanVar, DoubleVar, IntVar, StringVar)何时使用变量类? (布尔变量、双变量、整数变量、字符串变量)
【发布时间】:2017-11-16 16:38:01
【问题描述】:

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

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

var_cls 是否更容易在方法/类等之间共享?


变量类示例:

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

没有变量类的示例:

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

【问题讨论】:

  • 您可以将相同的StringVar 分配给LabelEntry,当您更改Entry 中的文本时,它会自动更改Label 中的文本。

标签: python tkinter tk


【解决方案1】:

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

这些变量的两大优势是:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,公平地说,您要么必须保留小部件的句柄,要么保留变量的句柄。在这两种情况下,您都必须保留、处理和调用函数才能更新值。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2017-06-21
      • 2016-11-29
      • 1970-01-01
      • 2019-12-15
      相关资源
      最近更新 更多