Панель инструментов (gtk.Toolbar)

Toolbar обычно используется для того чтобы сгруппировать некое число виджетов и упростить настройку их внешнего вида, а также расположения. Обычно панель инструментов содержит кнопки с иконками, метки и всплывающие подсказки, но на неё может быть помещён любой виджет. Наконец, элементы могут быть выстроены горизонтально или вертикально, а кнопки могут быть отображены с иконками, подписями или и с тем, и с другим.

Создание панели инструментов (как вы, наверное, уже подозреваете) происходит с помощью следующей функции:

  toolbar = gtk.Toolbar()

После создания панели инструментов на неё с любой стороны, либо в произвольном месте можно добавлять пункты или любые виджеты. Под пунктом мы подразумеваем метку, всплывающую подсказку, иконку для кнопки и функцию вызова для неё. Например, для добавления пункта вы можете использовать один из следующих методов:

  toolbar.append_item(text, tooltip_text, tooltip_private_text, icon, callback, user_data=None)

  toolbar.prepend_item(text, tooltip_text, tooltip_private_text, icon, callback, user_data)

Но если вы хотите использовать метод insert_item(), то добавляется ещё один параметр, определяющий позицию для вставки:

  toolbar.insert_item(text, tooltip_text, tooltip_private_text, icon, callback,
                      user_data, position)

Для того чтобы было проще добавлять промежутки между пунктами панели инструментов, вы можете использовать следующие методы:

  toolbar.append_space()

  toolbar.prepend_space()

  toolbar.insert_space(position)

Если это необходимо, ориентация, стиль и состояние всплывающей подсказки могут быть изменены “на лету”, использованием следующих методов:

  toolbar.set_orientation(orientation)

  toolbar.set_style(style)

  toolbar.set_tooltips(enable)

Где orientation принимает значение ORIENTATION_HORIZONTAL или ORIENTATION_VERTICAL. Аргумент style используется для изменения внешнего вида пунктов панели инструментов, он принимает TOOLBAR_ICONS, TOOLBAR_TEXT, либо TOOLBAR_BOTH. Аргумент enable принимает значения только TRUE или FALSE.

Для того чтобы рассмотреть особенности панели инструментов, мы возьмём пример toolbar.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# пример toolbar.py
 
import pygtk
pygtk.require('2.0')
import gtk
 
class ToolbarExample:
    # Этот метод подключается к кнопке Close или
    # закрытию окна с помощью оконного менеджера
    def delete_event(self, widget, event=None):
        gtk.main_quit()
        return False
 
    # Это просто... когда одна из кнопок нажата, мы просто
    # проверяем какая из них активна и выбираем стиль для панели инструментов
    # соответственно
    def radio_event(self, widget, toolbar):
        if self.text_button.get_active(): 
            toolbar.set_style(gtk.TOOLBAR_TEXT)
        elif self.icon_button.get_active():
            toolbar.set_style(gtk.TOOLBAR_ICONS)
        elif self.both_button.get_active():
            toolbar.set_style(gtk.TOOLBAR_BOTH)
 
    # Ещё проще, просто проверяем переданный ToggleButton и включаем/выключаем
    # всплывающие подсказки
    def toggle_event(self, widget, toolbar):
        toolbar.set_tooltips(widget.get_active())
 
    def __init__(self):
        # Здесь наше основное окно(диалоговое) и обработчик для HandleBox
        # Ok, нам нужна панель инструментов, иконка с маской (одна для всех
        # кнопок) и виджет icon в который мы поместим иконку (но
        # мы создадим отдельный виджет для каждой кнопки)
        # Создаём новое окно с заголовком, и правильным размером
        dialog = gtk.Dialog()
        dialog.set_title("GTKToolbar Tutorial")
        dialog.set_size_request(450, 250)
        dialog.set_resizable(True)
 
        # Обычно мы закрываемся когда кто-то пытается нас закрыть
        dialog.connect("delete_event", self.delete_event)
 
        # Для того чтобы всё сделать правильно мы поместим панель инструментов в HandleBox,
        # и сможем отделятся от главного окна
        handlebox = gtk.HandleBox()
        dialog.vbox.pack_start(handlebox, False, False, 5)
 
        # Панель инструментов будет горизонтальной, с иконкой, текстом и
        # с 5 пикс. промежутками между пунктами, и наконец
        # вы также поместим её на наш HandleBox
        toolbar = gtk.Toolbar()
        toolbar.set_orientation(gtk.ORIENTATION_HORIZONTAL)
        toolbar.set_style(gtk.TOOLBAR_BOTH)
        toolbar.set_border_width(5)
        handlebox.add(toolbar)
 
        # Наш первый пункт это кнопка <close>
        iconw = gtk.Image() # icon widget
        iconw.set_from_file("gtk.xpm")
        close_button = toolbar.append_item(
            "Закрыть",                  # метка кнопки
            "Закрыть это приложение",   # всплывающая подсказка кнопки
            "Private",                  # скрытая всплывающая подсказка
            iconw,                      # икнока
            self.delete_event)          # сигнал
        toolbar.append_space()          # промежуток
 
        # Теперь, давайте создадим нашу группу переключателей...
        iconw = gtk.Image() # icon widget
        iconw.set_from_file("gtk.xpm")
        icon_button = toolbar.append_element(
            gtk.TOOLBAR_CHILD_RADIOBUTTON, # тип элемента
            None,                          # виджет
            "Иконка",                      # метка
            "Только иконки в панели",      # всплывающая подсказка
            "Private",                     # скрытая всплывающая подсказка
            iconw,                         # иконка
            self.radio_event,              # сигнал
            toolbar)                       # данные для сигнала
        toolbar.append_space()
        self.icon_button = icon_button
 
        # Следующий переключатель получает ссылку на предыдущий
        iconw = gtk.Image() # icon widget
        iconw.set_from_file("gtk.xpm")
        text_button = toolbar.append_element(
            gtk.TOOLBAR_CHILD_RADIOBUTTON,
            icon_button,
            "Текст",
            "Только текст в панели",
            "Private",
            iconw,
            self.radio_event,
            toolbar)
        toolbar.append_space()
        self.text_button = text_button
 
        iconw = gtk.Image() # icon widget
        iconw.set_from_file("gtk.xpm")
        both_button = toolbar.append_element(
            gtk.TOOLBAR_CHILD_RADIOBUTTON,
            text_button,
            "Оба",
            "Иконки и текст в панели",
            "Private",
            iconw,
            self.radio_event,
            toolbar)
        toolbar.append_space()
        self.both_button = both_button
        both_button.set_active(True)
 
        # Здесь мы имеем простой ToggleButton
        iconw = gtk.Image() # icon widget
        iconw.set_from_file("gtk.xpm")
        tooltips_button = toolbar.append_element(
            gtk.TOOLBAR_CHILD_TOGGLEBUTTON,
            None,
            "Tooltips",
            "Панель с подсказками или без них",
            "Private",
            iconw,
            self.toggle_event,
            toolbar)
        toolbar.append_space()
        tooltips_button.set_active(True)
 
        # для того чтобы разместить виджет на панели инструментов, нужно только
        # создать его и добавить с соответствующей всплывающей подсказкой
        entry = gtk.Entry()
        toolbar.append_widget(entry,  "Это - только вход", "Private")
 
        # ладно, он не создан в панели инструментов, но мы всё ещё можем показать его.
        entry.show()
 
        # Вот оно! давайте покажем всё.
        toolbar.show()
        handlebox.show()
        dialog.show()
 
def main():
    # отдохнём в gtk_main и подождём начала веселья!
    gtk.main()
    return 0
 
if __name__ == "__main__":
    ToolbarExample()
    main()

Начальная часть кода должна быть знакома вам, если это не первая ваша программа с использованием PyGTK. Также есть дополнительная вещь – мы импортируем красивую XPM картинку( gtk.xpm) которая будет служить иконкой для всех кнопок. Строка 10 начинает класс ToolbarExample и строки 12-14 определяют callback-метод, который завершает программу.

Строки 19-30 это два callback-метода, которые вызываются тогда, когда нажимается одна из кнопок на панели инструментов. Вы уже должны быть знакомы с такими вещами, если использовали переключатели.

Со строки 32 всё это похоже на любое другое приложение PyGTK. Простая инициализация экземпляра объекта ToolbarExample, создание окна и т.д. Но здесь есть одна вещь, требующая разъяснений: HandleBox. HandleBox также как и любой другой *Box может быть использован для размещения виджетов. Разница между ним и обычными Box’ами в том, что он может отделяться от основного окна (или, на самом деле, HandleBox остаётся на своём родителе, но уменьшается до очень маленького прямоугольника, когда его содержимое находится на новом свободном окне). Обычно это удобно для съёмной панели инструментов, поэтому эти два виджета часто появляются вместе.

То, что мы сделали в строках 54-58 – это инициализация виджета Toolbar.

В строках 61-69 мы видим простейший случай: добавление кнопки на панель инструментов. До того, как добавлять новый пункт, мы создали виджет Image с иконкой (этот шаг будет повторяться для каждого нового пункта). После пункта мы также добавляем промежуток, чтобы следующие пункты не размещались вплотную. Как вы видите метод append_item() возвращает ссылку на нашу созданную кнопку, так мы можем работать с ней обычным способом.

Далее (строки 72-84) мы создаём группу переключателей. Для этого мы используем метод append_element(). На самом деле, использование этого метода также может добавлять простые пункты или промежутки (type = gtk.TOOLBAR_CHILD_SPACE , либо gtk.TOOLBAR_CHILD_BUTTON). В нашем случае – мы создаём группу переключателей. Для создания других переключателей из группы, нужна ссылка на предыдущий. Именно так легко может быть создан список переключателей (см Раздел 6.4, “Раздел RadioButton”). Также мы сохраняем ссылку на кнопку в экземпляре ToolbarExample для дальнейшего использования.

В строках 87-114 мы создаём другие переключатели точно тем же путём, за исключением того, что передаём сылку на уже созданный переключатель в метод append_element() для того чтобы указать группу.

И в конце мы вручную устанавливаем состояние одной из кнопок (иначе они все остаются в активном состоянии, защищая нас от переключения между ними).

Кстати, ToggleButton может быть создан обычным путём (если вы уже знаете как происходит создание переключателей).

Как вы видите в строках 133-137, добавление любых виджетов на панель инструментов просто. Только нужно помнить, что мы должны показывать эти виджеты вручную (в противоположность пунктам, которые показываются вместе с панелью инструментов).

Строка 142 заканчивает определение класса ToolbarExample. Строки 144-147 определяют функцию main() которая просто вызывает функцию gtk.main() для начала цикла обработки событий. Строки 149-151 создают экземпляр ToolbarExample и вводят его в цикл обработки событий. Так, здесь мы заканчиваем наш раздел посвящённый панели инструментов. Конечно, для того чтобы полностью оценить его вам также нужна хорошая XPM иконка, gtk.xpm. Рисунок 10.8, “Пример панели инструментов” показывает получаемое окно:

Рисунок 10.8. Пример панели инструментов

Toolbar Example

Предыдущая страница На уровень выше  Следующая страница
10.10. Группы кнопок (gtk.HButtonBox, gtk.VButtonBox) Оглавление  10.12. Вкладки (gtk.Notebook)

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>