Checkbutton - кнопка-флажок

В Tkinter при помощи виджета Checkbutton создаются флажки.

Экземпляры Checkbutton также могут быть визуально оформлены в группу, но каждый флажок независим от остальных. Каждый может быть в состоянии «установлен» или «снят», независимо от состояний других флажков. Другими словами, в группе Checkbutton можно сделать множественный выбор, в группе Radiobutton – нет.

Флажки не требуют установки между собой связи, поэтому может возникнуть вопрос, а нужны ли тут переменные Tkinter? Они нужны, чтобы снимать сведения о состоянии флажков. По значению связанной с Checkbutton переменной можно определить, установлен ли флажок или снят, что в свою очередь повлияет на ход выполнения программы.

У каждого флажка должна быть своя переменная Tkinter:

from tkinter import *
from tkinter.ttk import *

root = Tk()

ch_var1 = BooleanVar()
ch_var1.set(0)
Checkbutton(text="First", variable=ch_var1, onvalue=1, offvalue=0).pack(anchor=W)

ch_var2 = BooleanVar()
ch_var2.set(0)
Checkbutton(text="Second", variable=ch_var2, onvalue=1, offvalue=0).pack(anchor=W)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Результат выполнения кода:

checkbutton_two

С помощью опции onvalue устанавливается значение, которое принимает связанная переменная при включенном флажке. С помощью свойства offvalue – при выключенном. В данном случае оба флажка будут выключены, так как методом set() были установлены соответствующие этому значения.

Checkbutton - является кнопкой, поэтому поддерживает опцию command для вызова функции. Реализуем вызов функции с выводом результата выбора флажков в консоль:

from tkinter import *
from tkinter.ttk import *

def print_value():
    print("First: {}".format(ch_var1.get()))
    print("Second: {}".format(ch_var2.get()))

root = Tk()

ch_var1 = BooleanVar()
ch_var1.set(0)
Checkbutton(text="First", variable=ch_var1, onvalue=1, offvalue=0, command=print_value).pack(anchor=W)

ch_var2 = BooleanVar()
ch_var2.set(0)
Checkbutton(text="Second", variable=ch_var2, onvalue=1, offvalue=0, command=print_value).pack(anchor=W)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Вариант вывода в консоль:

First: False
Second: True
1
2

Типы переменных для флажков могут разных типов: BooleanVar(), IntVar() и StringVar():

from tkinter import *
from tkinter.ttk import *

def print_value():
    print("First: {}".format(ch_var1.get()))
    print("Second: {}".format(ch_var2.get()))
    print("Third: {}".format(ch_var3.get()))

root = Tk()

ch_var1 = BooleanVar()
ch_var1.set(0)
Checkbutton(text="First", variable=ch_var1, onvalue=1, offvalue=0, command=print_value).pack(anchor=W)

ch_var2 = IntVar()
ch_var2.set(0)
Checkbutton(text="Second", variable=ch_var2, onvalue=5, offvalue=-5, command=print_value).pack(anchor=W)

ch_var3 = StringVar()
ch_var3.set("")
Checkbutton(text="Third", variable=ch_var3, onvalue="выбран", offvalue="не выбран", command=print_value).pack(anchor=W)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Вариант вывода в консоль:

First: False
Second: 5
Third: не выбран
1
2
3

Упражнения

  1. Напишите программу тест, выдержав стилистику расположения виджетов. Надписи для копирования:

    • "11, для строчного типа данных"
    • "5, цена с надбавкой для рыночной экономики"
    • "10, для чисел двоичной системы счисления"
    • "2, для чисел троичной системы счисления и выше"
    • "Выберите ответы, которые считаете верными"

    checkbutton_test_01.png

    При выборе 1, 3 и 4 вариантов выводиться "Верно!":

    checkbutton_test_03.png

    При выборе не всех правильных ответов выводиться "ответ не полный":

    checkbutton_test_04.png

    В комбинациях ответов в которых указан второй (неверный) вариант выводиться "ошибка":

    checkbutton_test_02.png

  2. Напишите программу с флажками выбора 5 цветов и кнопкой "Print" в левом фрейме. Текстовым полем справа. При нажатии на кнопку в текстовое поле выводятся выбранные цвета, если ни один цвет не выбран, выводиться: "Please choose the color"

    checkbuttons_button_text.png

    Воспользовавшись оператором if-elif-else реализуйте корректное отображение через ',' и оканчивающееся на '.' Для получения длинны содержимого тестового текстового поля можно использовать команду:

    len(txt.get(1.0, END))
    
    1
  3. Напишите программу по теме анекдота:

    Идет урок математики в грузинской школе.
    Учитель спрашивает у детей:
    - Дэты, сколко будэт 2+2?
    ученик 1:
    - 3!
    учитель:
    - нет.
    ученик 2:
    - 5!
    учитель:
    - нет.
    ученик 3:
    - 4!
    учитель:
    - нет.
    ученик 4:
    - 7!
    учитель:
    - Верно! ... сэмь, восэм, но не больше дэвяти.
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    Пример начальной формы теста:

    checkbutton_math_test_01.png

    Внимательно пропишите логику проверку ответов. Правильный вариант ответа, только при выборе своей версии и вводе 7 или 8:

    checkbutton_math_test_03.png

    Остальные версии ответов должны выдавать ответ "не правильно":

    checkbutton_math_test_02.png