Меню (gtk.Menu)

Есть два пути для создания меню: простой и посложнее. Оба имеют свои достоинства, но обычно используется ItemFactory (простой способ). “Сложный” способ – это создание всех пунктов меню с использованием вызовов напрямую. Простой путь сводится к вызову gtk.ItemFactory, но он имеет свои недостатки в некоторых случаях.

Примечание

В PyGTK 2.4 ItemFactory объявлена устаревшей – используйте UIManager.

ItemFactory намного проще в использовании, при добавлении новых пунктов меню, хотя написание нескольких вспомогательных функций для ручного метода, может статься долгим путём к удобству использования. К тому же, с Itemfactory невозможно добавление изображений или символа ‘/’ для меню.

11.1. Ручное создание меню

По традиции обучения, сначала покажем сложный путь :)

Есть три виджета, которые учавствуют в создании строки меню и подменю:

  • MenuItem, который является тем, что выбирает пользователь, например “Сохранить”
  • Menu, который является контейнером для MenuItem, и
  • MenuBar, который является контейнером для каждого отдельного Menu

Это слегка сложно, потому что виджет MenuItem может использоваться для двух вещей. Он может быть размещён в Menu, и может быть размещён в MenuBar, который, при выбооре, откроет Menu.

Давайте рассмотрим функции, используемые для создания меню и строк меню. Первая функция используется для создания строки меню:

  menu_bar = gtk.MenuBar()

Эта, говорящая сама за себя функция, создаёт новую строку меню.

  menu = gtk.Menu()

Эта функция возвращает ссылку на новое меню. Само меню никогда не показывается (методом show()), это просто контейнер для вложенных пунктов (MenuItem). Вам станет яснее, когда вы посмотрите пример.

Следующая функция используется для создания пунктов меню и их размещения в Menu (и MenuBar):

  menu_item = gtk.MenuItem(label=None)

label, будет проверяться на мнемонические команды. Этот вызов используется для создания пунктов меню. Запомните разницу между Menu и MenuItem. MenuItem является кнопкой, с определённым действием, а Menu это контейнер содержащий в себе MenuItem.

Когда вы создали MenuItem, вам нужно разместить его в Menu. Это происходит с помощью метода append(). Затем нужно соединить пункт с сигналом “activate” обычным путём. Так, если мы хотим создать стандартное меню Файл, с пунктами Открыть, Сохранить, и Выход, код должен выглядеть примерно так:

file_menu = gtk.Menu()    # Menu не нужно показывать

# Create the menu items
open_item = gtk.MenuItem("Open")
save_item = gtk.MenuItem("Save")
quit_item = gtk.MenuItem("Quit")

# Add them to the menu
file_menu.append(open_item)
file_menu.append(save_item)
file_menu.append(quit_item)

# Attach the callback functions to the activate signal
open_item.connect_object("activate", menuitem_response, "file.open")
save_item.connect_object("activate", menuitem_response, "file.save")

# We can attach the Quit menu item to our exit function
quit_item.connect_object ("activate", destroy, "file.quit")

# We do need to show menu items
open_item.show()
save_item.show()
quit_item.show()

С этого момента мы отображаем наше меню. Теперь нам нужно создать строку меню и пункт меню для записи Файл, которая будет открывать наше меню. Код выглядит примерно так:

  menu_bar = gtk.MenuBar()
  window.add(menu_bar)
  menu_bar.show()

  file_item = gtk.MenuItem("Файл")
  file_item.show()

Теперь, нам нужно связать меню с file_item. Для этого используется метод:

  menu_item.set_submenu(submenu)

Так, наш пример будет продолжаться с:

  file_item.set_submenu(file_menu)

Всё что нам осталось сделать – это добавить меню к строке меню, что происходит с помощью метода:

  menu_bar.append(child)

который в нашем случае выглядит так:

  menu_bar.append(file_item)

Если мы хотим разместить меню справа, так часто рамещают меню справки, можно использовать следующий метод (снова на file_item в текущем примере) до присоединения его к MenuBar.

  menu_item.set_right_justified(right_justified)

Здесь собраны все шаги нужные для создания строки меню с присоединёнными меню:

  • Создайте новое меню, используя gtk.Menu()
  • Используйте вызовы к gtk.MenuItem() для каждого пункта в вашем меню. И используйте метод append() для размещения каждого нового пункта в меню.
  • Создайте пункт меню, используя gtk.MenuItem(). Это будет корень меню, текст открывающий список пунктов на строке меню.
  • Используйте метод set_submenu() для того чтобы присоединить меню к корню меню (который мы создали на прошлом шаге).
  • Создайте новую строку меню, используя gtk.MenuBar(). Этот шаг нужно выполнить один раз тогда, когда вы создаёте несколько меню на одной строке меню.
  • Используйте метод append() для помещения корневого меню на строку меню.

Создание контекстного меню очень похоже. За тем исключением что меню не помещается “автоматически” на строку меню, а явно, вызовом метода popup(), например от нажатия на кнопку. Выполните следующие шаги:

  • Создайте событие обрабатывающее callback. Оно должно иметь формат:
      def handler(widget, event):
  • И затем используйте это событие чтобы выбрать, где открывать меню.
  • В обработчике события, если событие это щелчок кнопки мыши, обращайтесь с ним как с событием кнопки, и используйте его как показано в примере, для того чтобы передать информацию методу popup().
  • Привяжите обработчик события к виджету с помощью:
      widget.connect_object("event", handler, menu)
  • где widget это виджет к которому вы привязываете обработчик, handler это обрабатывающпя функция, и menu это меню созданное с помощью gtk.Menu(). Это может быть меню которое также присутствует на строке меню, как показано в примере.

Предыдущая страница На уровень выше  Следующая страница
10.13. Встраивание процессов (gtk.Plug, gtk.Socket) Оглавление  11.2. Пример ручного создания

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

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

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