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 (字符串) |
relief | Scale的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
是平台化的滑动条,因此它允许设置的选项很少,
只能设置 from
、to
和 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()