Пример itemfactory.py использует gtk.ItemFactory. Рисунок 11.2, “Пример Item Factory” показывает получаемое окно:
Исходный код для itemfactory.py:
#!/usr/bin/env python # -*- coding: utf8 -*- # example itemfactory.py import pygtk pygtk.require('2.0') import gtk class ItemFactoryExample: # Необходимый простой callback def print_hello(self, w, data): print "Hello, World!" # Это структура ItemFactoryEntry, используемая для создания новых меню. # Пункт 1: Путь меню. Символ после подчёркивания создаёт ускоритель # действующий когда меню открыто. # Пункт 2: Назначение ускорителя для пункта. # Пункт 3: Callback. # Пункт 4: Параметр передающийся в вызов # callback функций, по умолчанию 0. # Пункт 5: Тип пункта. # Может принимать значение: # NULL -> "<Item>" # "" -> "<Item>" # "<Title>" -> создаёт пункт-заголовок //title item, проверить. # "<Item>" -> создаёт простой пункт # "<CheckItem>" -> создаёт пункт-CheckButton # "<ToggleItem>" -> создаёт пункт-ToggleButton # "<RadioItem>" -> создаёт пункт-RadioButton # <path> -> путь к другому переключателю для связывания в группу # "<Separator>" -> создаёт разделитель # "<Branch>" -> создаёт подменю (опционально) # "<LastBranch>" -> создаёт меню справа def get_main_menu(self, window): accel_group = gtk.AccelGroup() # Эта функция инициализирует item factory. # Параметр 1: Тип меню - может быть MEnuBar, Menu # или OptionMenu. # Параметр 2: Путь к меню. # Параметр 3: Ссылка на AccelGroup. Item factory настраивает # таблицу ускорителей, когда генерирует меню. item_factory = gtk.ItemFactory(gtk.MenuBar, "<main>", accel_group) # Этот метод генерирует пункты меню. Передайте item factory # список пунктов меню. item_factory.create_items(self.menu_items) # Присоединяем AccelGroup к окну. window.add_accel_group(accel_group) # Нужно сохранить ссылку на item_factory чтобы избежать её разрушения. self.item_factory = item_factory # Наконец, возвращаем строку меню созданную с помощью item factory. return item_factory.get_widget("<main>") def __init__(self): self.menu_items = ( ( "/_File", None, None, 0, "<Branch>" ), ( "/File/_New", "<control>N", self.print_hello, 0, None ), ( "/File/_Open", "<control>O", self.print_hello, 0, None ), ( "/File/_Save", "<control>S", self.print_hello, 0, None ), ( "/File/Save _As", None, None, 0, None ), ( "/File/sep1", None, None, 0, "<Separator>" ), ( "/File/Quit", "<control>Q", gtk.main_quit, 0, None ), ( "/_Options", None, None, 0, "<Branch>" ), ( "/Options/Test", None, None, 0, None ), ( "/_Help", None, None, 0, "<LastBranch>" ), ( "/_Help/About", None, None, 0, None ), ) window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.connect("destroy", lambda w: gtk.main_quit(), "WM destroy") window.set_title("Item Factory") window.set_size_request(300, 200) main_vbox = gtk.VBox(False, 1) main_vbox.set_border_width(1) window.add(main_vbox) main_vbox.show() menubar = self.get_main_menu(window) main_vbox.pack_start(menubar, False, True, 0) menubar.show() window.show() def main(): gtk.main() return 0 if __name__ == "__main__": ItemFactoryExample() main()
Пока здесь только этот пример. Объяснения и куча комментариев будут позже.
Предыдущая страница | На уровень выше | Следующая страница |
11.3. Использование фабрики элементов | Оглавление | Глава 12. Область рисования (gtk.DrawingArea) |