Scale представляет ползунок со шкалой, на которой можно выбрать одно из числовых значений.
Среди параметров Scale следует отметить следующие:
orient: направление виджета. Может принимать значения HORIZONTAL/"horizontal" и
VERTICAL/"vertical"
from_: начальное значение шкалы виджета, представляет тип float
to: конечное значение шкалы виджета, представляет тип float
length: длина виджета
command: функция, которая выполняется при изменении текущего значения
value: текущее значение шкалы виджета, представляет тип float
variable: переменная IntVar или DoubleVar, к которой привязано текущее значение виджета
Простейший Scale в горизонтальной и вертикальной ориентации:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x250")
verticalScale = ttk.Scale(orient=VERTICAL, length=200, from_=1.0, to=100.0, value=50)
verticalScale.pack()
horizontalScale = ttk.Scale(orient=HORIZONTAL, length=200, from_=1.0, to=100.0, value=30)
horizontalScale.pack()
root.mainloop()
Привязка к переменной
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
val = IntVar(value=10)
ttk.Label(textvariable=val).pack(anchor=NW)
horizontalScale = ttk.Scale(orient=HORIZONTAL, length=200, from_=1.0, to=100.0, variable=val)
horizontalScale.pack(anchor=NW)
root.mainloop()
В данном случае и метка Label, и виджет Scale привязаны к переменной val:
Параметр command позволяет установить функцию, которая будет выполняться при изменении текущего значения Scale. В качестве параметра в эту функцию передается новое значение:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
def change(newVal):
label["text"] = newVal
# или так
# label["text"] = scale.get()
label = ttk.Label()
label.pack(anchor=NW)
scale = ttk.Scale(orient=HORIZONTAL, length=200, from_=1.0, to=100.0, command=change)
scale.pack(anchor=NW)
root.mainloop()
В данном случае новое значение Scale передается в метку label:
Для получения текущего значения Scale можно использовать его метод get():
label["text"] = scale.get()
Стоит учитывать, что передаваемое в функцию значение newVal представляет строку, а точнее значение типа float в строковом виде. Но что делать, если мы хотим выводить в метке label не строку или даже float, а целое число? В этом случае необходимо выполнить цепь преобразований:
def change(newVal):
float_value = float(newVal) # получаем из строки значение float
int_value = round(float_value) # округляем до целочисленного значения
label["text"] = int_value