Ver Feed RSS

root@blog:/# chmod o+r *

Python & USBManager: Notificações

Avalie este Post de Blog
Continuando a serie de posts sobre o Python e o USBManager... A noite de ontem foi dedicada a dois assuntos: Sinais no DBus/HAL e Notificações com Python e GTK. Vamos começar com o essencial: Sinais.


Sinais no DBus/HAL

"Sinais, ah, já vi esse filme!". Não!! Não é isso... Sinais (signals) é o nome utilizado para se referir a "eventos" na interface gráfica. Quando temos um botão na interface e você clica nele é gerado um sinal. Quem estiver "escutando" esse sinal toma uma "atitude".

O bom do DBus/HAL é que ele implementa alguns tipos de sinais, assim eu consigo descobrir quando um dispositivo foi inserido/removido ou quando uma propriedade de um dispositivo foi alterado. Essa última eu achei uma das mais interessantes pois vai simplificar muito o controle das informações na interface. Em compensação terei que reescrever toda a lógica aplicação

Vou mostrar um exemplo rápido sobre como "escutar" os sinais do DBus...

Código:

import gobject
import dbus
from dbus.mainloop.glib import DBusGMainLoop

DBusGMainLoop(set_as_default=True)

def device_add(volume_udi):
    print 'New device added: ', volume_udi

def device_removed(volume_udi=None):
    print 'A device was removed!'

def properties_changed(key, was_added=None, was_removed=None, path=None):
    print 'Properties changed on', path

bus = dbus.SystemBus()
hal_manager_obj = bus.get_object( \\"org.freedesktop.Hal\\", \\"/org/freedesktop/Hal/Manager\\")
hal_manager = dbus.Interface(hal_manager_obj, \\"org.freedesktop.Hal.Manager\\")

# Connecting singals for new devices
hal_manager.connect_to_signal(\\"DeviceAdded\\", device_add)
hal_manager.connect_to_signal(\\"DeviceRemoved\\", device_removed)

# Only Storage Devices
volume_udi_list = hal_manager.FindDeviceByCapability ('volume')
for volume_udi in volume_udi_list:
    # Some needed variables
    volume_obj = bus.get_object (\\"org.freedesktop.Hal\\", volume_udi)
    volume = dbus.Interface(volume_obj, \\"org.freedesktop.Hal.Device\\")
    storage_udi = volume.GetProperty ('block.storage_device')
    storage_obj = bus.get_object (\\"org.freedesktop.Hal\\", storage_udi)
    storage = dbus.Interface(storage_obj, \\"org.freedesktop.Hal.Device\\")

    # Only USB devices
    if storage.GetProperty(\\"storage.bus\\") == 'usb':
        # Properties changed signal
        volume_obj.connect_to_signal(\\"PropertyModified\\", properties_changed, path_keyword='path')

loop = gobject.MainLoop()
loop.run()
Bem... Não vou me ater muita a explicar o código mas basicamente ele faz os imports, define as funções pra gerar um output, cria o DBus, se conecta aos sinais, lista os dispositivos de armazenamento pega somente os dispositivos via USB, se coneta ao sinal de propriedades alteradas (aos dispositivos conectados atualmente) e por último entra num loop infinito.

Importante ressaltar que se for utilizar esse código em uma interface GTK é desnecessário o import do módulo gobject e o loop pois o gtk.main() vai substituí-lo. Outra coisa importante é que esse código só imprime a alteração propriedades de dispositivos que estejam conectados no momento que o programa é executado. Já a adição/remoção de dispositivos funcionará para qualquer dispositivos. Isso ocorre porque não nos "conectamos" aos dispositivos conectados por último.

Vamos para o mais interessante...



Notificações com Python e GTK

Agora que temos como saber se foram adicionados/removidos dispositivos vamos avisar isso para o usuário. Para isso usei a biblioteca pynotify.

Uma notificação deve estar atrelada a um StatusIcon (ou mais conhecido como SystemTray). Vamos alterar o código do StatusIcon que eu postei ontem...

Código:
import pygtk
pygtk.require('2.0')
 import gtk
 import pynotify
 
statusIcon = gtk.StatusIcon()
statusIcon.set_from_file( \\"small_icon.png\\")
statusIcon.set_visible(True)
statusIcon.set_tooltip(\\"USB Volume Storage Manager\\")

pynotify.init(\\"USB Volume Storage Manager\\")

notification = pynotify.Notification( \\"Título da notificação\\", \\"Esse é um texto para a notificação...\\", \\"dialog-information\\")
notification.attach_to_status_icon(statusIcon)
notification.set_urgency(pynotify.URGENCY_LOW)
notification.set_timeout(5000)
notification.show()
Quem viu o último post notou que são só 6 linhas a mais:

  1. Iniciar o pynotify;
  2. Instanciar uma notificação;
  3. Vinculá-lo a uma StatusIcon;
  4. Setar uma urgência;
  5. Setar um timeout (tempo para a notificação desaparecer automaticamente);
  6. Mostrar a notificação


Agora vou mostrar como implementei isso no USBManager:



Alguém ai tem mais idéias de notificações?!?!

É isso ai pessoal... Sempre que aprendo algo novo em Python fico impressionado com a facilidade do código (tirando o DBus e HAL que foi f***)!

Hum... Como será que isso fica no sistema de notificação do Ubuntu 9.04??

Até mais...

Atualizado 20-01-2010 em 08:13 por Magnun

Categorias
Dicas , Python , Dicas , Projetos , USBManager

Comentários


+ Enviar Comentário



Visite: BR-Linux ·  VivaOLinux ·  Dicas-L