22-Tkinter 组件-Scale滑块

文章介绍了Tkinter库中的Scale滑块控件的使用,包括设置滑块的范围、精度、样式等属性,并展示了如何绑定鼠标释放事件读取滑块值。同时提到了ttk.LabeledScale,这是一个平台化的滑动条,提供了简单的自定义选项。文章通过示例代码说明了如何创建和操作这两个滑块组件。
摘要由CSDN通过智能技术生成

Scale滑块

tkinter.Scale

Scale: 尺度(拉动条),允许你通过滑块来设置一数字值。在需要用户给出评价等级,或者给出一个评价分数,或者拉动滑动条提供一个具体的数值等等。

滑块控件实例的主要方法比较简单,有 get()set(值),分别为取值和将滑块设在某特定值上。

滑块实例也可绑定鼠标左键释放事件<ButtoonRelease-1>,并在执行函数中添加参数event来实现事件响应。

主要属性见下表:

属性功能描述
from_起始值(最小可取值)
to终止值(最大可取值)
showvalue设置是否显示当前值。布尔值
lable标签文字,默认为无
length滑块控件实例宽(水平方向)或 高(垂直方向),默认为100像素
width控件实例本身的宽度,默认为15像素
orient滑块控件实例纵横方向,HORIZONTAL 水平(默认)或VERTICAL垂直方向
repeatdelay定义滑块开始连续移动的延迟时间,单位时毫秒,默认值是300。当鼠标在滑动槽按下并保持,到滑块开始连续移动的时间间隔就是repeatdelay。
repeatinterval当滑块开始移动后,滑块每次移动之间的时间间隔是repeatinterval来定义的。默认值是100,单位是毫秒。
tickinterval标尺刻度间隔,显示刻度,并定义刻度的粒度。默认为0,若设置过小,则会重叠
resolution滑块移动的粒度,就是每次移动数值的变化,即最小值间隔.设置该 Scale 滑动时的步长。
sliderlength滑块宽度,默认为30 像素
sliderrelief设置滑块的立体样式。
state状态,若设置 state=DISABLED,则滑块控件实例不可用,有三种:NORMAL,DISABLED,ACTIVE
digits设置有效数字至少要有几位。如0-20,设置3的话最多可显示xx.x 或x.xx
variable用于与变量进行绑定。返回数值类型,可为IntVar(整数)、DoubleVar(浮点数)、或 StringVar(字符串)
reliefScale的3D外观。
troughcolor设置轨道的背景色。
foreground/fg设置前景颜色。就是显示Scale数值的颜色。

例如:在一个窗体上设计一个200像素宽的水平滑块,取值范围为1.0~5.0,分辨精度为0.05,刻度间隔为 1,用鼠标拖动滑块后释放鼠标可读取滑块值并显示在标签上。效果如下:

# coding = utf8
# File date: Hi_2021/12/31 21:54
# File_name: 17_Scale滑块.py

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        # 初始化并调用父类初始化
        super().__init__(master)
        self.master = master

        self.create_widget()

    def create_widget(self):
        """创建组件"""
        scale_value = DoubleVar()
        scale_value.set(1)
        lb = Label(self.master, text=f"滑块取值:{scale_value.get()}")
        lb.pack()

        scl = Scale(self.master,
                    orient=HORIZONTAL,
                    length=200, width=20,
                    from_=1.0, to=5.0,
                    label='请拖动滑块',
                    tickinterval=1, resolution=0.05,
                    variable=scale_value)

        # 绑定鼠标左键当释放时,注意带参数绑定方法
        scl.bind("<ButtonRelease-1>", lambda event: Application.callback(scale_value, lb))

        scl.pack()

    @staticmethod
    def callback(scale_value, lb):
        s = f"滑块取值:{scale_value.get()}"
        lb.config(text=s)


if __name__ == '__main__':
    root = Tk()
    root.geometry("300x300+600+500")
    root.title("17_Scale滑块")
    app = Application(master=root)
    root.mainloop()

当通过xx.bind()绑定事件且带有其他参数时可通过lambda函数,如上例子lambda event: Application.callback(scale_value, lb).

看到有人说3.8会报错要改成:btn.bind("<Button-1>",lambda event:handle(event,1, 2, 3))

ttk.LabeledScale

如果使用 ttk.Scale 组件,则更接近操作系统本地的效果,但允许定制的选项少。
ttk.LabeledScale 是平台化的滑动条,因此它允许设置的选项很少,
只能设置 fromto compound 等有限的几个选项,而且它总是生成一个水平滑动条(不能变成垂直的),
其中 compound 选项控制滑动条的数值标签是显示在滑动条的上方,还是滑动条的下方。

ttk.LabeledScale(master, variable, from_, to, compound: Literal["top", "bottom"], **kw: Any) -> None

用父母版构造一个水平的 LabeledScale,一个 与 Ttk Scale 小部件及其范围相关联的变量。 如果未指定变量,则创建 tkinter.IntVar。 小部件特定选项 复合:“顶部”或“底部” 指定如何相对于比例显示标签。 默认为“顶部”。

  • master所在容器
  • variable与之绑定的变量
  • from_, to指定滑块滑动数字范围
  • compound滑块对应数字位于滑动条上下, 可选"top", "bottom"
# coding = utf-8
# File date: Hi_2022/1/2 21:13
# File_name: 20_LabelScale数字滑快.py
from tkinter import *
from tkinter import ttk


class S_demo:
    def __init__(self, master):
        self.root = master
        self.main()

    def main(self):
        self.scale_demo()
        self.labeledscale_demo()

    def scale_demo(self):
        doubleVar = DoubleVar()
        scale = Scale(self.root,
                      from_=-100,  # 设置最大值
                      to=100,  # 设置最小值
                      resolution=5,  # 设置步长
                      label='Sacle:',  # 设置标签内容

                      length=400,  # 设置轨道的长度
                      width=30,  # 设置轨道的宽度
                      troughcolor='lightblue',  # 设置轨道的背景色

                      sliderlength=20,  # 设置滑块的长度
                      sliderrelief=SUNKEN,  # 设置滑块的立体样式

                      showvalue=True,  # 设置显示当前值
                      orient=HORIZONTAL,  # 设置水平方向
                      digits=5,  # 设置十位有效数字
                      variable=doubleVar)  # 绑定变量
        scale.config(command=lambda event: S_demo.change(scale, doubleVar))  # 绑定事件处理函数)
        scale.pack()
        scale.set(20)

        f = Frame(self.root)
        f.pack(fill=X, expand=YES, padx=10)
        Label(f, text='是否显示值:').pack(side=LEFT)

        showvar = BooleanVar()
        showvar.set(True)
        Radiobutton(f, text="不显示", value=False, variable=showvar, command=lambda: S_demo.valueshow(scale, showvar)).pack(side=LEFT)
        Radiobutton(f, text="显示", value=True, variable=showvar, command=lambda: S_demo.valueshow(scale, showvar)).pack(side=LEFT)

        Label(f, text='方向:').pack(side=LEFT)
        orientVar = IntVar()
        Radiobutton(f, text="水平", value=0, variable=orientVar, command=lambda: S_demo.scaleorient(scale, orientVar)).pack(side=LEFT)
        Radiobutton(f, text="垂直", value=1, variable=orientVar, command=lambda: S_demo.scaleorient(scale, orientVar)).pack(side=LEFT)
        orientVar.set(0)

    def labeledscale_demo(self):
        f = Frame(self.root)
        f.pack(fill=X, expand=YES, padx=10)
        Label(f, text='LabeledScale:').pack(anchor=NW)
        labeledscale = ttk.LabeledScale(f,
                                        from_=-100,  # 设置最大值
                                        to=100,  # 设置最小值
                                        compound=BOTTOM)  # 显示数值在滑动条下方

        labeledscale.value = -20
        labeledscale.pack(fill=X, expand=YES)

    @staticmethod
    def change(scale, doubleVar):
        print(scale.get(), doubleVar.get())

    @staticmethod
    def valueshow(scale, showvar):
        scale['showvalue'] = showvar.get()

    @staticmethod
    def scaleorient(scale, orientVar):
        scale['orient'] = VERTICAL if orientVar.get() else HORIZONTAL


if __name__ == '__main__':
    root = Tk()
    S_demo(root)
    mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值