Кнопки одиночного выбора (RadioButton, они же: переключатели) во многом похожи на кнопки множественного выбора (CheckButton) за тем исключением, что они группируются, и одновременно может быть включен только один переключатель. Именно это свойство позволяет их полноценно называть ПЕРЕключатели. Они удобны, когда в вашем приложении необходимо выбрать одно значение из короткого списка опций.
Создание нового переключателя выполняется этим вызовом:
radio_button = gtk.RadioButton(group=None, label=None) |
Вы должны были заметить в этом вызове дополнительный аргумент. Виджету RadioButton для работы требуется аргумент group. Первый вызов к gtk.RadioButton() должен передавать None как первый аргумент, тогда создаётся новая группа переключателей, в которой будет только созданный RadioButton.
Для того чтобы добавить больше RadioButton, передайте ссылку на другой RadioButton (включённый в нужную группу) в вызове RadioButton().
Если в аргументе label указан текст, то он проверяется на префикс ‘_’ для мнемонических команд.
Также хорошей идеей будет явно выбирать, какой переключатель будет включен по умолчанию, с помощью:
radio_button.set_active(is_active) |
Этот метод объясняется в разделе о кнопках-выключателях (ToggleButton), и работает аналогично. Когда переключатели одиночного выбора сгруппированы вместе, одновременно может быть активен только один из группы. Если пользователь совершает щелчок по RadioButton, тогда сначала первый RadioButton излучает сигнал “toggled” (сообщает о выключении), и тогда сигнал “toggled” излучает вторая кнопка (сообщает о включении).
Программа-пример radiobuttons.py создаёт группу из трёх переключателей. Рисунок 6.4, “Пример использования RadioButton” показывает полученное окно:
Исходный код программы:
#!/usr/bin/env python # --*-- coding:utf-8 --*-- # example radiobuttons.py import pygtk pygtk.require('2.0') import gtk class RadioButtons: def callback(self, widget, data=None): print "%s было нажато %s" % (data, ("OFF", "ON")[widget.get_active()]) def close_application(self, widget, event, data=None): gtk.main_quit() return False def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect("delete_event", self.close_application) self.window.set_title("Переключатели") self.window.set_border_width(0) box1 = gtk.VBox(False, 0) self.window.add(box1) box1.show() box2 = gtk.VBox(False, 10) box2.set_border_width(10) box1.pack_start(box2, True, True, 0) box2.show() button = gtk.RadioButton(None, "переключатель 1") button.connect("toggled", self.callback, "переключатель 1") box2.pack_start(button, True, True, 0) button.show() button = gtk.RadioButton(button, "переключатель 2") button.connect("toggled", self.callback, "переключатель 2") button.set_active(True) box2.pack_start(button, True, True, 0) button.show() button = gtk.RadioButton(button, "переключатель 3") button.connect("toggled", self.callback, "переключатель 3") box2.pack_start(button, True, True, 0) button.show() separator = gtk.HSeparator() box1.pack_start(separator, False, True, 0) separator.show() box2 = gtk.VBox(False, 10) box2.set_border_width(10) box1.pack_start(box2, False, True, 0) box2.show() button = gtk.Button("Закрыть") button.connect_object("clicked", self.close_application, self.window, None) box2.pack_start(button, True, True, 0) button.set_flags(gtk.CAN_DEFAULT) button.grab_default() button.show() self.window.show() def main(): gtk.main() return 0 if __name__ == "__main__": RadioButtons() main()
Этот код довольно прост. Строки 63-64 делают кнопку “Закрыть” виджетом по умолчанию, так, если окно активно, по нажатию клавиши “Enter” заставит кнопку “Закрыть” излучить сигнал “clicked”.
Предыдущая страница | На уровень выше | Следующая страница |
6.3. Флажки (gtk.CheckButton) | К оглавлению | Глава 7. Регуляторы |