11 marzo, 2007

Una classe per le notifiche con python e dbus

Ogni tanto trovo un minuto per migliorare il mio progetto planimo ed imparo qualcosa di nuovo su python e le varie estensioni. In un prossimo post vi annuncerò le grandi novità del progetto ma per ora vi voglio presentare un metodo semplice per far apparire le notifiche sul nostro desktop (solo unixes, no Windows). La notifica sarà simile a questa:


La notifica apparirà in basso a destra sul desktop per un periodo di tempo impostabile.
Dbus è un sistema per la comunicazione tra processi. In pratica si sfrutterà dbus per comunicare con il demone delle notifiche.

Il codice python



import dbus

ICON = "file:///home/redgun/python/planimo/data/icons/planimo48.png"

class Notifier:
def __init__(self):
self.session_bus = dbus.SessionBus()
obj = self.session_bus.get_object("org.freedesktop.Notifications",
"/org/freedesktop/Notifications")
self.notif = dbus.Interface(obj, "org.freedesktop.Notifications")

def notify(self, title, message, iconfile = ICON, time = 3000):
try:
self.notif.Notify("Notification",
dbus.UInt32(0), iconfile, title, message,
[], [], dbus.Int32(time), dbus.UInt32(0))
except:
try:
self.notif.Notify("Notification",
dbus.UInt32(0), iconfile, title, message,
[], [], dbus.Int32(time))
except Exception, detail:
print detail

if __name__ == "__main__":
n = Notifier()
n.notify("Titolo", "messaggio stile bold", time=5000)


Per far funzionare questo codice è necessario che il pacchetto python-dbus sia installato sul vostro sistema (Ubuntu lo installa per default). Il metodo notify prova ad invocare il metodo self.notif.Notify in due modi diversi a causa di una modifica delle api della libnotify (vedi qui per maggiori info). Il primo metodo infatti funziona su Ubuntu Edgy, il secondo sulla Feisty. Il parametro time server per impostare la durata in millisecondi della notifica.

6 commenti:

  1. Hao, inanzitutto complimenti per il tuo blog e per le notizie che dai :)

    cmq riguardo questo script in python andando ad eseguirlo mi da questo errore:
    -------

    Traceback (most recent call last):
    File "dbus.py", line 26, in ?
    n = Notifier()
    File "dbus.py", line 7, in __init__
    self.session_bus = dbus.SessionBus()
    AttributeError: 'module' object has no attribute 'SessionBus'

    da cosa può dipendere

    RispondiElimina
  2. Grazie per i complimenti

    Probabilmente dipende dal fatto che hai chiamato il file dbus.py. Prova a dargli un altro nome ed assicurati che nella stessa directory non esista un file dbus.pyc

    Io uso Ubuntu Edgy è funziona correttamente. L'ho testato anche su Feisty

    RispondiElimina
  3. Grazie era proprio quello
    il problema, ma pensa te
    a volte la soluzione più semplice
    e quella più probabile
    :)
    grazie ancora

    RispondiElimina
  4. C'e' un modo per mettere un bottone sul "fumetto" di notifica?

    RispondiElimina
  5. @AS

    Grazie per il commento, è stato l'ispirazione per un nuovo post dove spiego come fare ciò che chiedi. Puoi leggerlo qui

    RispondiElimina