Пример ручного создания

Давайте рассмотрим пример menu.py для того чтобы прояснить принципы создания меню в GTK. Рисунок 11.1, “Пример меню” показывает получаемое окно:

Рисунок 11.1. Пример меню

Menu Example

Исходный код 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. Использование фабрики элементов

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

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

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