Виджеты Checkbutton – флажки, или чекбоксы в Tkinter
Экземпляры Checkbutton
также как радиокнопки могут быть визуально оформлены в группу, но каждый флажок независим от остальных. Каждый может быть в состоянии "установлен" или "снят", независимо от состояний других флажков. Другими словами, в группе экземпляров Checkbutton
можно сделать множественный выбор.
Чекбоксы не требуют установки между собой связи, поэтому может возникнуть вопрос, а нужны ли тут переменные Tkinter? Они нужны, чтобы снимать сведения о состоянии флажков (другими словами, чекбоксы хранят в себе значения). По значению связанной с Checkbutton
переменной можно определить, установлен флажок или снят, что в свою очередь повлияет на ход выполнения программы.
from tkinter import * root = Tk() v = IntVar() Checkbutton(text='Banana', variable=v, command=lambda: print(v.get())).pack() root.mainloop()
Если запустить такую программу и кликать по флажку (переключать его из "вкл" во "выкл" и обратно), то в терминал будут выводиться числа 1 и 0. Таковы по умолчанию значения опций onvalue
(значение установленного флажка) и offvalue
(значение снятого флажка).
from tkinter import * root = Tk() a = Checkbutton(text='Banana') print(a['onvalue']) # 1 print(a['offvalue']) # 0 a.pack() root.mainloop()
Эти значения присваиваются переменной Tkinter, привязанной к флажку (в примере выше таковой нет). Если мы хотим хранить другие значения, описывающие состояние чекбокса, можем присвоить их явно. С помощью опции onvalue
устанавливается значение, которое принимает связанная переменная при включенном флажке. С помощью свойства offvalue
– при выключенном.
v = StringVar(value='yes') Checkbutton(text='Banana', variable=v, onvalue='yes', offvalue='no').pack()
В данном случае флажок сразу после запуска программы будет установлен.
У каждого флажка должна быть своя переменная Tkinter. Иначе при включении одного флажка, другой будет выключаться, так как значение общей tkinter-переменной изменится и не будет равно значению опции onvalue
первого флажка.
from tkinter import * root = Tk() def show(): lab['text'] = f'{var1.get()}, {var2.get()}' frame = Frame() frame.pack(side=LEFT) var1 = BooleanVar() Checkbutton(frame, text='First', variable=var1, onvalue=1, offvalue=0, command=show).pack(anchor=W, padx=10) var2 = IntVar(value=-1) Checkbutton(frame, text='Second', variable=var2, onvalue=1, offvalue=0, command=show).pack(anchor=W, padx=10) lab = Label(width=25, height=5, bg='lightblue') lab.pack(side=RIGHT) root.mainloop()
Оба флажка при запуске программы будут выключены, так как их переменным были установлены отличные от onvalue
значения.
С помощью методов select
и deselect
флажков можно их программно включать и выключать. То же самое относится к радиокнопкам.
from tkinter import * class CheckButton: def __init__(self, master, title): self.var = BooleanVar() self.var.set(False) self.title = title self.cb = Checkbutton( master, text=title, variable=self.var, onvalue=True, offvalue=False) self.cb.pack(side=LEFT) def ch_on(): for ch in checks: ch.cb.select() def ch_off(): for ch in checks: ch.cb.deselect() root = Tk() f1 = Frame() f1.pack(padx=10, pady=10) checks = [] for i in range(10): checks.append(CheckButton(f1, i)) f2 = Frame() f2.pack() button_on = Button(f2, text='Все ВКЛ', command=ch_on) button_on.pack(side=LEFT) button_off = Button(f2, text='Все ВЫКЛ', command=ch_off) button_off.pack(side=LEFT) root.mainloop()
Практическая работа
Напишите приложение, в котором при установке флажка в окне появляется метка (экземпляр Label
), а при снятии – она исчезает. Для удаления виджета воспользуйтесь его методом pack_forget
.
Курс с примерами решений практических работ: pdf-версия