Виджет Spinbox позволяет выбрать значение (чаще число) из некоторого списка.
Основные параметры Spinbox:
values: набор значений виджета в виде списка или кортежа
from_: минимальное значение (тип float)
to: максимальное значение (тип float)
increment: приращение значения (тип float)
textvariable: определяет переменную StringVar, которая хранит текущее значение виджета
command: указывает на функцию, которая вызывается при изменении значения виджета
wrap: при значении True создает зацикленный список, при котором после минимального значения идет максимальное.
background: фоновый цвет
foreground: цвет текста
font: шрифт виджета
justify: выравнивание текста, принимает значения "left" (по левому краю), "right" (по правому краю) и "center" (по центру)
width: ширина виджета
state: состояние виджета
Простейший Spinbox:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
spinbox = ttk.Spinbox(from_=1.0, to=100.0)
spinbox.pack(anchor=NW)
root.mainloop()
В данном случае мы можем выбрать одно из чисел от 1 до 100. При нажатии на стрелочки вверх и вниз на виджете значение виджета будет увелиличивается и уменьшаться на единицу:
По умолчанию приращение идет на единицу, но с помощью параметра increment можно установить другое значение, например, приращение на 2:
ttk.Spinbox(from_=1.0, to=100.0, increment=2)
Также по умолчанию мы можем, не используя стрелочки, ввести в текстовое поле виджета какое-либо значение, даже то, которое не входит в диапазон значений. Если нам надо запретить ввод значений в текстовое поле и оставить
доступными для выбора значений только стрелочки, то для этого можно установить для параметра state значение readonly:
spinbox = ttk.Spinbox(from_=1.0, to=100.0, state="readonly")
С помощью параметра textvariable можно привязать значение Spinbox к переменной StringVar:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x150")
spinbox_var = StringVar(value=22) # начальное значение 22
label = ttk.Label(textvariable=spinbox_var)
label.pack(anchor=NW)
spinbox = ttk.Spinbox(from_=1.0, to=100.0, textvariable=spinbox_var)
spinbox.pack(anchor=NW)
root.mainloop()
Здесь для наглядности добавлена метка, которая выводит выбранное значение. В качестве начального значения применяется число 22.
Для получения текущего значения у Spinbox вызывается метод get()
current_value = spinbox.get()
Чтобы обработать изменение значения нужно определить функцию, которая будет срабатывать при изменении значения, и передать ее параметру command:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
def change():
label["text"] = spinbox.get()
label = ttk.Label()
label.pack(anchor=NW)
spinbox = ttk.Spinbox(from_=1.0, to=100.0, command=change)
spinbox.pack(anchor=NW)
root.mainloop()
В данном случае при изменении значении срабатывает функция change в которой измененяем текст метки label в соответствии с новым значением
Данный виджет необязательно должен представлять список из числовых значений. В реальности это может быть любой набор значений в виде списка или кортежа, который можно установить с помощью параметра values:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x150")
spinbox_var = StringVar()
languages=["Python", "JavaScript", "C#", "Java", "C++"]
label = ttk.Label(textvariable=spinbox_var)
label.pack(anchor=NW)
spinbox = ttk.Spinbox(textvariable=spinbox_var, values=languages)
spinbox.pack(anchor=NW)
root.mainloop()
В данном случае Spinbox позволяет выбрать одно из значений из списка languages: