Элемент Checkbutton представляет собой флажок, который может находиться в двух состояниях: отмеченном и неотмеченном.
Конструктор Checkbutton принимает ряд параметров, отметим основные из них:
command: ссылка на функцию, которая вызывается при нажатии на флажок
cursor: курсор при наведении на элемент
image: графическое изображение, отображаемое на элементе
offvalue: значение флажка в неотмеченном состоянии, по умолчанию равно 0
onvalue: значение флажка в отмеченном состоянии, по умолчанию равно 1
padding: отступы от текста до границы флажка
state: состояние элемента, может принимать значения NORMAL (по умолчанию), DISABLED и ACTIVE
text: текст элемента
textvariable: привязанный к тексту объект StringVar
underline: индекс подчеркнутого символа в тексте флажка
variable: ссылка на переменную, как правило, типа IntVar, которая хранит состояние флажка
width: ширина элемента
Создадим простейший флажок:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
enabled = IntVar()
enabled_checkbutton = ttk.Checkbutton(text="Включить", variable=enabled)
enabled_checkbutton.pack(padx=6, pady=6, anchor=NW)
enabled_label = ttk.Label(textvariable=enabled)
enabled_label.pack(padx=6, pady=6, anchor=NW)
root.mainloop()
Отличительной чертой Checkbutton является возможность привязки к переменной через параметр variable, который представляет значение флажка. Здесь данный параметр привязан к переменной enabled типа IntVar. В отмеченном состоянии привязанный объект IntVar имеет значение 1, а в неотмеченном - 0. В итоге через IntVar мы можем получать значение, указанное пользователем.
С помощью параметра command можно установить функцию, которая будет вызываться при изменении состояния флажка:
from tkinter import *
from tkinter import ttk
from tkinter.messagebox import showinfo
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
def checkbutton_changed():
if enabled.get() == 1:
showinfo(title="Info", message="Включено")
else:
showinfo(title="Info", message="Отключено")
enabled = IntVar()
enabled_checkbutton = ttk.Checkbutton(text="Включить", variable=enabled, command=checkbutton_changed)
enabled_checkbutton.pack(padx=6, pady=6, anchor=NW)
root.mainloop()
Здесь при изменении состояния флажка срабатывает функция checkbutton_changed. В ней в зависимости от состояния флажка (а точнее в зависимости от значения
переменной enabled) с помощью встроенной функции showinfo() отображаем сообщение о состоянии флажка:
Параметры onvalue и offvalue позволяют задать значение флажка в отмеченном и неотмеченном состоянии. По умолчанию они равны 1 и 0 соответственно. Однако мы можем передать им и другие, более удобные для нас значения.
from tkinter import *
from tkinter import ttk
from tkinter.messagebox import showinfo
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
def checkbutton_changed():
showinfo(title="Info", message=enabled.get())
enabled = StringVar()
enabled_checkbutton = ttk.Checkbutton(text="Включить", variable=enabled, offvalue="Отключено", onvalue="Включено", command=checkbutton_changed)
enabled_checkbutton.pack(padx=6, pady=6, anchor=NW)
root.mainloop()
Теперь переменная enabled представляет StringVar, то есть хранит строку. Соответственно параметры offvalue и onvalue тоже представляют строку
Для установки текста флажка можно использовать параметры text и textvariable. Причем мы можем привязать текст флажка к его значению
с помощью textvariable:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
enabled_on = "Включено"
enabled_off = "Отключено"
enabled = StringVar(value=enabled_on)
enabled_checkbutton = ttk.Checkbutton(textvariable=enabled, variable=enabled, offvalue=enabled_off, onvalue=enabled_on)
enabled_checkbutton.pack(padx=6, pady=6, anchor=NW)
root.mainloop()
В данном случае для хранения текста в отмеченном и неотмеченном состояниях определены две переменные: enabled_on и enabled_off. Переменная enabled инициализируется
тем же значением (enabled_on), что и параметр onvalue, поэтому по умолчанию флажок будет отмечен. А поскольку его параметры textvariable и variable
привязаны к одной и той же переменной enabled, то они будет изменяться синхронно
Аналогичным образом можно использовать наборы флажков:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
def select():
result = "Выбрано: "
if python.get() == 1: result = f"{result} Python"
if javascript.get() == 1: result = f"{result} JavaScript"
if java.get() == 1: result = f"{result} Java"
languages.set(result)
position = {"padx":6, "pady":6, "anchor":NW}
languages = StringVar()
languages_label = ttk.Label(textvariable=languages)
languages_label.pack(**position)
python = IntVar()
python_checkbutton = ttk.Checkbutton(text="Python", variable=python, command=select)
python_checkbutton.pack(**position)
javascript = IntVar()
javascript_checkbutton = ttk.Checkbutton(text="JavaScript", variable=javascript, command=select)
javascript_checkbutton.pack(**position)
java = IntVar()
java_checkbutton = ttk.Checkbutton(text="Java", variable=java, command=select)
java_checkbutton.pack(**position)
root.mainloop()
В данном случае языки, которые соответствуют выбранным чекбоксам, будут отображаться на текстовой метке: