Python

индекс
250,37

Gnome Applets. Введение

Апплет — это небольшое приложение, которое интегрированно в Gnome панель и выполняет какие — либо поэтапные действия. В этой серии постов, я хочу рассказать как создаются эти самые gnome applets, от простого к чему-нибудь к более сложному и интересному. Для создания апплетов мы будем использовать PyGTK, но в принципе писать апплеты для Gnome можно и с помощью связки С + GTK+. Обычно апплет состоит из двух частей:- Описанние самого апплета и его действий на каком — либо языке программирования (в нашем случае python)- Файл описания мета-информации (файл с расширением .server, содержащий мета-информацию апплета)Перейдем к практике. Создадим для начала простейший апплет, который не будет нести никакой практической пользы, но с теоритической части важен, так как дает общие понятия о строении апплетов. Апплет будет представлять из себя простую кнопку, которую можно будет добавить на панель, нажать на эту кнопку, вот в принципе и весь функционал данного простого приложения, в следующих постах перейдем к более интересным, и главное полезным вещам.Создадим файл SimpleApplet.py в котором будет содержаться функционал нашего апплета. Код апплета:
Copy Source | Copy HTML
#!/usr/bin/env python
 
import pygtk
import sys
pygtk.require('2.0')
 
import gnomeapplet
import gtk
 
def factory(applet, iid):
    button = gtk.Button()
    button.set_relief(gtk.RELIEF_NONE)
    button.set_label("Simple Button")
    button.connect("button_press_event", showMenu, applet)
    applet.add(button)
    applet.show_all()
    return True
 
def showMenu(widget, event, applet):
    if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
        widget.emit_stop_by_name("button_press_event")
        create_menu(applet)
 
def create_menu(applet):
    propxml="""
            <popup name="button3">
            <menuitem name="Item 3" verb="About" label="_About" pixtype="stock" pixname="gtk-about"/>
            </popup>"""
    verbs = [("About", showAboutDialog)]
    applet.setup_menu(propxml, verbs, None)
 
def showAboutDialog(*arguments, **keywords):
    pass
 
if len(sys.argv) == 2:
    if sys.argv[1] == "run-in-window":
        mainWindow = gtk.Window(gtk.WINDOW_TOPLEVEL)
        mainWindow.set_title("Ubuntu System Panel")
        mainWindow.connect("destroy", gtk.main_quit)
        applet = gnomeapplet.Applet()
        factory(applet, None)
        applet.reparent(mainWindow)
        mainWindow.show_all()
        gtk.main()
        sys.exit()
 
if __name__ == '__main__':
    print "Starting factory"
    gnomeapplet.bonobo_factory("OAFIID:Gnome_Panel_Example_Factory", gnomeapplet.Applet.__gtype__, "Simple gnome applet example", "1.0", factory)
 
Теперь что касается мета-информации нашего апплета. Создадим файл с расширением .server и назовем его SimpleApplet.server. Данный файл будет содержать в XML формате описание мета-информации нашего апплета (отображаемую иконку, путь к исполняемому .py файлу и др.) Для разных апплетов основной каркас .server остается неизменяемым. SimpleApplet.server:
Copy Source | Copy HTML
<oaf_info>
<oaf_server iid="OAFIID:Gnome_Panel_Example_Factory" type="exe" location="/home/SimpleApplet.py">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:Bonobo/GenericFactory:1.0"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="Gnome Applet Example"/>
<oaf_attribute name="description" type="string" value="Simple gnome applet example"/>
</oaf_server>
<oaf_server iid="OAFIID:Gnome_Panel_Example" type="factory" location="OAFIID:Gnome_Panel_Example_Factory">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:GNOME/Vertigo/PanelAppletShell:1.0"/>
<item value="IDL:Bonobo/Control:1.0"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="Example"/>
<oaf_attribute name="description" type="string" value="Simple gnome applet example"/>
<oaf_attribute name="panel:category" type="string" value="Utility"/>
<oaf_attribute name="panel:icon" type="string" value="computer.png"/>
</oaf_server>
</oaf_info>
Вот в принцепе и все. Наш апплет готов, он ничего не умеет делать, но его разработка дает общее представление об апплетах. Что бы добавить наш апплет на панель нужно проделать следующие действия:- Переместить файл SimpleApplet.server в каталог /usr/lib/bonobo/servers/- Сделать файл SimpleApplet.py исполняемым: chmod +x SimpleApplet.py — Добавить апплет на панель с помощью стандартного контекстного меню панелиВ итоге должен получится апплет в панели Gnome похожий на этот:image
+22
1 ноября 2009, 16:29
40
SHK

комментарии (15)

0
safright #
Можете сделать/показать/подсказать как в меню-апплете заменить слова — значками?
0
SHK #
К сожалению в данный момент, под рукой нет гнома, поэтому точно сказать не смогу. Во всяком случае надо копаться в gconf-editor.
0
spanasik #
Можно сразу поместить в блог PyGTK :-)
0
SHK #
Переместил.
0
spanasik #
Спасибо! :-)
+3
lol2Fast4U #
Мне кажется, что это уже было на хабре.
+2
SHK #
Вы это имели ввиду- habrahabr.ru/blogs/python/64317/?
0
lol2Fast4U #
да, да, оно!
+2
enchantner #
Спасибо, давно хотел научиться писать апплеты :) Хотел только попросить, можете использовать для подсветки кода хайлайтер, из которого можно копировать без номеров строк и который не съедает отступы? Например, s-c.me/
+2
verwolfdotss #
+1
особенно забавны съеденные отступы, ввиду из значимости в Python =)
+1
SHK #
Спасибо, переделал. Так лучше?
0
enchantner #
да, спасибо :)
+1
iscsi #
AFAIK Bonobo активно выпиливают и в GNOME3 его не будет
+1
iscsi #
prooflink: library.gnome.org/misc/release-notes/2.28/

P.S.: mutter + gnome-shell
+1
akho #
ну, gnome shell до готовности явно больше полугода.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.