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.