Python 为什么tkinter scale小部件需要tkinter变量

Python 为什么tkinter scale小部件需要tkinter变量,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我理解,您不需要为这样的比例指定变量: scale = tk.Scale(root, from_ = 1, to = 100) # makes scale without variable scaleValue = scale.get() # sets value to scale 一、 然而,我们需要一种方法来实时设置一个变量,并且每次刻度值都会发生变化。有没有一种方法可以在不经常将scaleValue重置为scale.get()?通过使用variable=tk.DoubleVar()生成t

我理解,您不需要为这样的比例指定变量:

scale = tk.Scale(root, from_ = 1, to = 100) # makes scale without variable
scaleValue = scale.get() # sets value to scale

一、 然而,我们需要一种方法来实时设置一个变量,并且每次刻度值都会发生变化。有没有一种方法可以在不经常将
scaleValue
重置为
scale.get()
?通过使用
variable=tk.DoubleVar()
生成tkinter变量,当发生更改时,它将自动更新
变量

scaleVar = tk.DoubleVar
scale = tk.Scale(
    root,
    from_ = 1,
    to = 100,
    variable = scaleVar    # makes scale with updating variable
)

如果您使用类似于
IntVar()
的函数来跟踪该值,您可以看到它是自动更新的,并带有一个检查当前值的函数

如果希望将值显示并返回为浮点值,则可以使用
DoubleVar()
,然后还可以将
resolution=0.01
设置为Scale小部件中的参数

import tkinter as tk

class Example(tk.Tk):
    def __init__(self):
        super().__init__()
        self.int_var = tk.IntVar()
        self.scale = tk.Scale(self, from_=1, to=100, variable=self.int_var)
        self.scale.pack()

        tk.Button(self, text="Check Scale", command=self.check_scale).pack()

    def check_scale(self):
        print(self.int_var.get())


if __name__ == "__main__":
    Example().mainloop()
结果:

例如,使用
DoubleVar()
可以执行以下操作:

import tkinter as tk

class Example(tk.Tk):
    def __init__(self):
        super().__init__()
        self.dou_var = tk.DoubleVar()
        self.scale = tk.Scale(self, from_=1, to=100, resolution=0.01, variable=self.dou_var)
        self.scale.pack()

        tk.Button(self, text="Check Scale", command=self.check_scale).pack()

    def check_scale(self):
        print(self.dou_var.get())


if __name__ == "__main__":
    Example().mainloop()
结果:


您可以使用tkinter变量类,并通过其
变量=
配置选项将其分配给
缩放
小部件。这里有一些关于的文档,可以帮助您开始。另见。棘手的部分是实时执行,因为tkinter不支持并发性,所以您需要通过队列或类似的方式在GUI和生成数据的任何对象之间进行通信。我猜,
scaleValue=tk.IntVar()
的可能重复应该可以做到这一点,对吗?@geetransiti在我的示例中添加了一个更新,其中还包括一个
DoubleVar()
。要正确使用此选项,还需要将分辨率设置为如下所示的浮点:
resolution=0.01
Ah。滑块可以输出浮点或整数,具体取决于分辨率,默认分辨率为1。目前我只需要整数输出,但现在我知道如何获得浮点输入。谢谢:D
BoolVar
不是什么东西。也就是说,
BooleanVar()
在这里仍然没有用处,因为它只会返回true.shot我是说tk.DoubleVar()。。。看起来我有个脑屁,DoubleVar更好。我认为IntVar在这里是最好的,因为它将返回一个整数,而您的滑块不需要返回浮点。DoubleVar返回一个浮点值。我听说滑块返回一个浮点值,这意味着如果我使用
tk.IntVar()
,它会将滑块值转换为int,对吗?滑块从不显示浮点值。也许这是一个需要设置的选项。这里有一篇关于Int和Double的帖子。