Языки программирования

Библиотека Tkinter: Обработка переключателей

Библиотека Tkinter содержит специальные классы, объекты которых выполняют роль переменных для хранения значений о состоянии различных виджетов.
Как и говорилось в статье «Библиотека Tkinter: Виджеты«, от класса Radiobutton создаются радио-кнопки, от класса Checkbutton – флажки.

Обработка зависимых переключателей

Изменение значения такой переменной ведет к изменению и свойства виджета, и наоборот: изменение свойства виджета изменяет значение ассоциированной переменной.
Существует несколько таких классов Tkinter, предназначенных для обработки данных разных типов:
StringVar() - для строк;
IntVar - целых чисел;
DoubleVar() - дробных чисел;
Booleanvar() - для обработки булевых значений (true и false).
Рассмотрим пример:
r_var = BooleanVar()
r_var.set(0)
r1 = Radiobutton(text='First', variable=r_var, value=0)
r2 = Radiobutton(text='Second', variable=r_var, value=1)
Здесь переменной r_var присваивается объект типа BooleanVar. С помощью метода set() он устанавливается в значение 0.

При запуске программы включенной окажется первая радио-кнопка, так как значение ее опции value совпадает с текущим значением переменной r_var. Если кликнуть по второй радио-кнопке, то она включится, а первая выключится. При этом значение r_var станет равным 1.

Пример работы программы с радио-кнопками:
from tkinter import *

def sel():
  selection = "Вы выбрали " + str(var.get())
  label.config(text = selection)
    
root = Tk()
root.title("Пример работы радио-кнопок")
root.minsize(width=500, height=400)

# создаем радио-кнопки используя переменную-объект типа IntVar()
var = IntVar()
R1 = Radiobutton(root, text="Windows", variable=var, value=1, command=sel)
R1.pack( anchor = W )

R2 = Radiobutton(root, text="Linux", variable=var, value=2, command=sel)
R2.pack( anchor = W )

R3 = Radiobutton(root, text="MacOS", variable=var, value=3, command=sel)
R3.pack( anchor = W )

label = Label(root)
label.pack()

# запускаем программу
root.mainloop()
В данной программе мы сначала создаем радио-кнопки, а затем назначаем команду sel для каждой радио-кнопки. При выборе той или иной кнопки передается значение, указанное в value. Вывод программы:

Обработка независимых переключателей

Флажки не требуют установки между собой связи, поэтому может возникнуть вопрос, а нужны ли тут переменные Tkinter?
Они нужны, чтобы снимать сведения о состоянии флажков. По значению связанной с Checkbutton переменной можно определить, установлен ли флажок или снят, что в свою очередь повлияет на ход выполнения программы.
Поскольку состояния флажков независимы друг от друга, то для каждого должна быть введена собственная ассоциированная переменная-объект. Рассмотрим пример программы с флажками:
from tkinter import *
    
root = Tk()
root.title("Пример работы флажков")
root.minsize(width=500, height=400)

var0 = StringVar() # значение каждого флажка
var1 = StringVar() # хранится в собственной переменной
var2 = StringVar()

# если флажок установлен, то в ассоциированную переменную
# (var0, var1 или var2) заносится значение onvalue,
# если флажок снят, то - offvalue.

ch0 = Checkbutton(root, text="Windows", variable=var0, onvalue="Выбран Windows", offvalue="-")
ch1 = Checkbutton(root, text="Linux", variable=var1, onvalue="Выбран Linux", offvalue="-")
ch2 = Checkbutton(root, text="MacOS", variable=var2, onvalue="Выбран MacOS", offvalue="-")

lis = Listbox(root, height=3)
def result(event):
  v0 = var0.get()
  v1 = var1.get()
  v2 = var2.get()
  l = [v0, v1, v2] # значение переменных заносится в список
  lis.delete(0,2)  # предыдущее значение удаляется из Listbox
  
  for v in l:      # содержимое списка l последовательно
    lis.insert(END,v) # вставляется в Listbox
    
but = Button(root, text="Получить значения")
but.bind('<Button-1>', result)

ch0.deselect() # по умолчанию флажки сняты
ch1.deselect()
ch2.deselect()

ch0.pack()
ch1.pack()
ch2.pack()
but.pack()
lis.pack()

# запускаем программу
root.mainloop()
Вывод программы:
С помощью методов select() и deselect() флажков можно их программно включать и выключать. То же самое относится к радио-кнопкам.

На этом мы завершаем нашу статью. Желаем Вам хорошего и чистого кода! Пишите в комментариях свои вопросы и примеры кода.

Видео по уроку:
Библиотека Tkinter