Давайте рассмотрим пример menu.py для того чтобы прояснить принципы создания меню в GTK. Рисунок 11.1, “Пример меню” показывает получаемое окно:
Исходный код menu.py:
#!/usr/bin/env python # -*- coding: utf8 -*- # example menu.py import pygtk pygtk.require('2.0') import gtk class MenuExample: def __init__(self): # создаём новое окно window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_size_request(200, 100) window.set_title("GTK Menu Test") window.connect("delete_event", lambda w,e: gtk.main_quit()) # Создаём виджет Menu, и запомните -- никогда # не используйте метод show() для виджета Menu!! # Это меню содержащее пункты меню, которые # которые появятся когда вы кликните по "корневому меню" menu = gtk.Menu() # Далее мы создаём небольшой цикл для того чтобы сделать три записи в # "test-menu". Заметьте вызов gtk_menu_append. Здесь мы # добавляем список пунктов к нашему меню. Обычно мы также # ловим сигнал "clicked" для каждого пункта меню, и настраиваем # callback для него, но здесь мы сэкономим место. for i in range(3): # копируем названия в buf. buf = "Test-undermenu - %d" % i # создаём новый menu-item под названием... menu_items = gtk.MenuItem(buf) # ...и добавляем его в меню. menu.append(menu_items) # Делаем что-нибудь интересное при выборе пункта menu_items.connect("activate", self.menuitem_response, buf) # показываем виджет menu_items.show() # Это корневое меню, и оно будет отображаться в строке меню # к нему не присоединены обработчики сигнала, и # он просто показывает меню при нажатии root_menu = gtk.MenuItem("Root Menu") root_menu.show() # Теперь указываем что мы хотим чтоюы наше созданное "menu" было # меню для "root menu" root_menu.set_submenu(menu) # vbox для размещения меню и кнопки vbox = gtk.VBox(False, 0) window.add(vbox) vbox.show() # создаём строку меню и добавляем её на окно menu_bar = gtk.MenuBar() vbox.pack_start(menu_bar, False, False, 2) menu_bar.show() # Создаём кнопку для контекстного меню button = gtk.Button("press me") button.connect_object("event", self.button_press, menu) vbox.pack_end(button, True, True, 2) button.show() # И наконец добавляем menu-item к menu-bar -- это # "root" menu-item menu_bar.append (root_menu) # Всегда показываем окно в последнюю очередь, так оно # отрисует всё на экране за один раз. window.show() # Ответ на нажатие кнопки в виде отображения меню # # Заметим что аргумент "widget" это отображаемое меню, а НЕ # нажатая кнопка. def button_press(self, widget, event): if event.type == gtk.gdk.BUTTON_PRESS: widget.popup(None, None, None, event.button, event.time) # Говорим вызывающему коду что мы обработали # это событие. return True # Говорим вызывающему коду что мы не обработали это событие, и отправляем его дальше return False # Выводим строку когда выбран пункт меню def menuitem_response(self, widget, string): print "%s" % string def main(): gtk.main() return 0 if __name__ == "__main__": MenuExample() main()
Также вы можете сделать пункты меню недоступными, использовать ускорители, привязывать кнопки к callback’ам меню.
Предыдущая страница | На уровень выше | Следующая страница |
Глава 11. Меню (gtk.Menu) | Оглавление | 11.3. Использование фабрики элементов |