Библиотека 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.
Пример работы программы с радио-кнопками:
При запуске программы включенной окажется первая радио-кнопка, так как значение ее опции 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() флажков можно их программно включать и выключать. То же самое относится к радио-кнопкам.
На этом мы завершаем нашу статью. Желаем Вам хорошего и чистого кода! Пишите в комментариях свои вопросы и примеры кода.
Видео по уроку:
На этом мы завершаем нашу статью. Желаем Вам хорошего и чистого кода! Пишите в комментариях свои вопросы и примеры кода.
Видео по уроку: