Строго говоря, в этом примере мы могли бы обойтись и без переменных tkinter. В примере 8.27 также реализована модель с одним выбором, но без переменных, — путем выбора и сброса элементов в группе вручную, в обработчике события. При каждом событии щелчка на переключателе вызывается метод deselect для всех объектов в группе и метод select для того переключателя, на котором был выполнен щелчок.
Пример 8.27. PP4E\Gui\Tour\demo-radio-manual.py
переключатели, сложный способ (без переменных)
обратите внимание, что метод deselect переключателя просто устанавливает пустую строку в качестве его значения, поэтому нам по-прежнему требуется присвоить переключателям уникальные значения или использовать флажки;
from tkinter import * state = ‘’ buttons = []
def onPress(i): global state state = i for btn in buttons:
btn.deselect() buttons[i].select()
root = Tk()
for i in range(10):
rad = Radiobutton(root, text=str(i),
value=str(i), command=(lambda i=i: onPress(i)) ) rad.pack(side=LEFT) buttons.append(rad)
onPress(0) # первоначально выбрать первый переключатель
root.mainloop()
print(state) # вывести информацию о состоянии перед выходом
Этот сценарий создает такое же окно с 10 переключателями, как на рис. 8.29, но реализует интерфейс с единственным выбором, причем текущее состояние хранится в глобальной переменной Python, значение которой выводится при завершении сценария. Все это библиотека tkinter может сделать вместо вас, если использовать связанную переменную tkinter и уникальные значения, как показано в примере 8.28.
Пример 8.28. PP4E\Gui\Tour\demo-radio-auto.py
# переключатели, простой способ
from tkinter import *
root = Tk() # IntVar также можно использовать
var = IntVar(0) # выбрать 0-й переключатель при запуске
for i in range(10):
rad = Radiobutton(root, text=str(i), value=i, variable=var) rad.pack(side=LEFT)
root.mainloop()
print(var.get()) # вывести информацию о состоянии перед выходом
Этот сценарий действует точно так же, но вводить и отлаживать его значительно проще. Обратите внимание, что в этом сценарии переключатели связываются с переменной типа IntVar, целочисленным собратом StringVar, которая инициализируется нулевым значением (которое также является значением по умолчанию) — если значения переключателей уникальны, можно также пользоваться и целыми числами.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011