Applety GNOME w Pythonie i PyGTK

Applety paneli w GNOME z łatwością można tworzyć w Pythonie, z pomocą PyGTK. Prosty applet składa się z pliku Pythona oraz pliku-servera Bonobo. Oto przykładowy, szkieletowy applet, gnomeAppletExample.py:
#!/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("ExampleButton")
        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)
import gtk

def factory(applet, iid):
        button = gtk.Button()
        button.set_relief(gtk.RELIEF_NONE)
        button.set_label("ExampleButton")
        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)
Plik gnomeAppletExample.server umieszczamy w /usr/lib/bonobo/servers:
<oaf_info>
        <oaf_server iid="OAFIID:Gnome_Panel_Example_Factory" type="exe" location="/ścieżka/do/gnomeAppletExample.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>
W sieci niewiele jest aktualnej dokumentacji, tak więc najwięcej dowiemy się przeglądając istniejące applety (gnomeapplet - nowy moduł, gnome.applet - stary moduł, dokumentacja przestarzała). Prosty applet do zarządzania Totemem znajdziemy na ywwg.com.
RkBlog

PyGTK, 8 December 2008

Comment article
Comment article RkBlog main page Search RSS Contact