Виджеты 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-версия


Tkinter. Программирование GUI на Python




Все разделы сайта