Python et comment créer un applet gnome

Publié le 16 mai 2010 par Mikebrant

Aujourd’hui, on va voir comment on crée un applet gnome en python. C’est très simple
Dans cet article, on va juste créer un applet à  2 balles qui va afficher une citation(donc pensez à  installer fortune) via le système de notifications.

1. La partie 1

Il faut savoir qu’un applet gnome est un composant Bonobo, c’est pourquoi chaque applet doit avoir un fichier .server contenant des informations compréhensibles par le Bonobo.

Donc il ne nous reste plus qu’à  créer ce fichier :

$ su -c "vim /usr/lib/bonobo/servers/GNOME_PetitApplet.server" (ajustez le chemin selon votre archi/distrib)

Dedans, on va lui mettre à§a :

<oaf_info>
<oaf_server iid= »OAFIID:GNOME_PetitApplet_Factory » type= »exe » location= »/usr/libexec/petitApplet.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_server>
<oaf_server iid= »OAFIID:GNOME_PetitApplet » type= »factory » location= »OAFIID:GNOME_PetitApplet_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= »Petit Applet »/>
<oaf_attribute name= »description » type= »string » value= »Petit Applet »/>
<oaf_attribute name= »panel:category » type= »string » value= »Utility »/>
<oaf_attribute name= »panel:icon » type= »string » value= »gnome-logo-icon-transparent.png »/></oaf_server>

</oaf_info>

Ce qu’il faut savoir de tout à§a:
- Le nom du fichier commence par GNOME_ et se termine par .server
- Le .server contient deux sections
- Il faut que nos 2 OAFIID (de nos 2 sections) soient uniques (GNOME Object Activation Framework Implementation ID) et doivent valoir : nomDuFichier[_Factory]

OK, mais à  quoi elles servent ces « sections » ?

Quand on veut ajouter un applet, on fait donc « clique droit », « ajouter au tableau de bord » .
La liste des applets apparait alors: c’est la deuxième section du code qui est chargée d’afficher notre applet avec son titre, sa description, sa catégorie et son image(qu’il va chercher dans /usr/share/pixmaps).
Une fois que l’on trouve notre applet et qu’on veut l’ajouter, alors on est redirigé sur la 1° section du code (via l’attribut location= »OAFIID:GNOME_PetitApplet_Factory« )
Dans cette section, il y a également un attribution location désignant le chemin (ajustez-le) vers notre script, et il y a aussi un attribut type , lequel définit notre script en tant qu’exécutable.

2. Un peu de GTK

Et oui….. vous ne vous trompez pas… il faut faire du GTK…enfer et damnation…

Voilà , il ne nous reste plus qu’à  créer notre fichier /usr/libexec/petitApplet.py et à  le remplir un peu, pour que notre applet soit fini.

Voici le bout de code :

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys, gtk
import pygtk
pygtk.require('2.0')
import gnomeapplet, gobject
import pynotify
import commands

class PetitApplet(gnomeapplet.Applet):
 """petit applet """

 def __init__(self,applet,iid):
   self.applet = applet
   label = gtk.Label("citation")
   # Calque
   calque = gtk.HBox()
   calque.pack_start(label)# On ajoute notre label
   calque.show_all()# on affiche les widgets du calque
   # Applet
   self.applet.add(calque)# On ajoute notre calque dans l'applet
   self.applet.show_all()# Et on affiche les widgets de notre applet
   # Le compte à  rebours
   self.timer = gobject.timeout_add(600000,self.citation)#en MS donc 600 000 ms = 10 minutes
   self.citation()# Mais on le lance une première fois tout de màªme

 def citation(self):
   """affiche une citation"""
   # On initialise pynotify
   pynotify.init('citation')# Le nom de l'appli
   notification = pynotify.Notification('citation',#titre
   commands.getoutput('fortune'),#la citation
   )
   notification.set_urgency(pynotify.URGENCY_NORMAL) # L'urgence de la notification
   notification.show()# Et on l'affiche

def lancement(applet, iid):
   PetitApplet(applet,iid)
   return True

if __name__ == '__main__':
 gobject.type_register(PetitApplet)

 if len(sys.argv) > 1 and sys.argv[1] == "-d":
   fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
   fenetre.set_title("Petit Applet")
   fenetre.connect("destroy", gtk.main_quit)
   app = gnomeapplet.Applet()
   lancement(app, None)
   app.reparent(fenetre)
   fenetre.show_all()
   gtk.main()
 else:
   gnomeapplet.bonobo_factory('OAFIID:GNOME_PetitApplet_Factory',\
   PetitApplet.__gtype__,'Petit Applet','0.1',lancement)

Ce qu’il faut faire pour créer un applet est de :
- Faire hériter notre classe représentant l’applet de gnomeapplet.Applet
- L‘enregistrer en tant que type PyGTK via gobject.type_register()
- Si on est en train de développer notre applet, il est bon de lancer dans une fenàªtre, d’o๠le if len(sys.argv) >1…
- Enfin, on lance notre applet via bonobo_factory() qui prend 5 arguments : l’OAFIIF de notre 1° section, le type de notre objet (donc il sera de type PyGTK),le titre de notre applet, sa version, et le lanceur(la callback).
- lanceur() instancie juste notre classe, et retourne True(ne pas l’oublier).
- Et voilà , notre applet apparait enfin !

Bon, je n’explique pas PetitApplet vu que ce n’est pas une intro au PyGTK(puis il y a les commentaires) :
pour faire un superbe applet, suffit de s’y connaitre en PyGTK (et d’avoir une bonne idée…)

En bref :
- pour créer une notification, il suffit de l’initialiser : pynotify.init(‘monProgramme’),de créer la notification : notification = pynotify.Notification(‘titre’,'message’), et de l’afficher : notification.show()
- commands.getoutput(maCommande) retourne la sortie de ma commande.

Voilà , c’est tout pour aujourd’hui.