I do what I can

Random thoughts from Mauricio Teixeira…

Aplicação na Área de Notificação do Gnome em Python (português)

with 4 comments

É bom ver como sua aplicação preferida no Gnome fica lá na área de notificação (também chamada de bandeja), e convenientemente fica lá até alguma coisa acontece. Você já se perguntou como se faz isso em Python?

Essa é uma demonstração não-tão-rápida e não-tão-limpa de como escrever uma pequena aplicação Gnome em Python que fica na área de notificação do Gnome (que também vamos chamar de “bandeja”), e reage a algumas ações de menu.

Você pode encontrar o código compledo baixando o arquivo hello-tray.py. Abaixo irei comentar as partes mais importantes do código, de forma que você entenda o básico, e possa criar seu próprio código daqui em diante.

Primeiro de tudo, acompanhe o raciocínio, eu decidi fazer a aplicação totalmente orientada a objetos, por que é mais fácil de expandir e adicionar recursos depois. Também é um ótimo exercício escrever até mesmo as aplicações mais simples utilizando POO (ou OOP), já que as aplicações mais complexas serão mais fáceis de manter se você assim as fizer, e prática leva à perfeição (bem, no mínimo a uma prática melhor). Também entenda que eu sou um programador de tempo livre (meu trabalho é como administrador de sistemas), então muitas coisas aqui podem estar mal explicadas ou mal codificadas, mas a idéia geral é o que importa. Vamos em frente.

Irei explicar como o código funciona seguinte o fluxo regular, como se executa em um ambiente de testes. Cada número no início da linha de código refere-se ao número da linha no arquivo em si (de forma que você possa acompanhar facilmente).

O código inicia com um comando Python simples que irá informar qual é o principal objeto da aplicação.

48: if __name__ == "__main__":
49:   helloWord = HelloTray()

A definição da classe inicia na linha 6. Veja que ao contrário do que você poderia esperar, a classe não precisa ser derivada de nenhuma outra. Isso acontece por que a aplicação em si não está na área de notificação, mas quem está lá é apenas a interface. Então precisamos criar essa interface.

08:  def __init__(self):
09:    self.statusIcon = gtk.StatusIcon()
10:    self.statusIcon.set_from_stock(gtk.STOCK_ABOUT)
11:    self.statusIcon.set_visible(True)
12:    self.statusIcon.set_tooltip("Hello World")

O código de inicialização da classe inicia criando um widget gtk.StatusIcon. Essa é a “mágica” que cria o ícone na bandeja. Funciona como se você estivesse criando uma gtk.Window em uma aplicação PyGTK normal. Agora precisamos definir algumas propriedades para este ícone. Nesse caso utilizamos um ícone GTK padrão, apenas para facilitar nossas vidas. Outra vantagem de utilizar ícones padrão é que sua aplicação vai ajustar-se facilmente ao tema ativo. A propriedade de dica de ferramenta (tool tip) na linha 12 define o texto que será exibido quando passarmos o mouse por cima do ícone.

14:    self.menu = gtk.Menu()
15:    self.menuItem = gtk.ImageMenuItem(gtk.STOCK_EXECUTE)
16:    self.menuItem.connect('activate', self.execute_cb, self.statusIcon)
17:    self.menu.append(self.menuItem)
18:    self.menuItem = gtk.ImageMenuItem(gtk.STOCK_QUIT)
19:    self.menuItem.connect('activate', self.quit_cb, self.statusIcon)
20:    self.menu.append(self.menuItem)

Agora precisamos criar um menu pop-up, que será exibido quando clicarmos com o botão direito sobre o ícone. Utilizamos um widget gtk.Menu padrão. O widget gtk.ImageMenuItem cria um item de menu com um pequeno ícone e um texto. Nesse caso, também estamos utilizando ícones padrão só para fazermos as coisas mais rápidas. Note que para cada item de menu existe um método de chamada associado (self.execute_cb e self.quit_cb), que serão executados quando o usuário clicar no item de menu. Essas são as verdadeiras “ações” da nossa pequena aplicação.

22:    self.statusIcon.connect('popup-menu', self.popup_menu_cb, self.menu)
23:    self.statusIcon.set_visible(1)
24:
25:    gtk.main()

Agora precisamos conectar o menu com a ação de “pop-up” do ícone na área de notificação. Isso também ativa o método de chamada associado (self.popup_menu_cb) que irá exibir o menu pop-up (linha 41 no código).

A linha 25 no código inicia a principal iteração GTK, que fará todos os widgets visíveis serem exibidos na tela. Nesse caso, o ícone agora é exibido na área de notificação. Clique com o botão direito no ícone, e você verá o belo menu pop-up.

45:        data.popup(None, None, gtk.status_icon_position_menu,
46:                   3, time, self.statusIcon)

Gostaria de fazer um pequeno comentário sobre essa parte do código. O gtk.status_icon_position_menu é um método de chamada associado à exibição do menu que funciona como um ajudante para verificar onde posicionar o próprio menu pop-up. Sem esse método de chamada, o pop-up vai ser exibido exatamente embaixo do cursor do mouse, exatamente onde o ícone for clicado. Com esse método de chamada, o menu é exibido abaixo do ícone, fora do painel (se o painel que contém a área de notificação está no topo, ou acima do ícone se está no fundo). Isso faz nossa aplicação paracer mais profissional.

O método de chamada execute_cb na linha 27 cria um gtk.Window padrão, com um gtk.Button padrão, que irão cumprimentar o mundo para provar que nossa aplicação funciona corretamente.

O método de chamada quit_cb na linha 38 simplesmente desativa tudo (fecha a janela, e retira o ícone da bandeja).

Bom, acho que é isso aí! A intenção aqui era de apenas mostrar como é fácil colocar sua aplicação na área de notificação, e apontar para os widgets necessários para a tarefa. Daqui em diante você pode criar suas próprias aplicações.

A propósito, sinta-se à vontade para comentar abaixo, e fazer qualquer pergunta. Ficarei muito satisfeito em ajudá-lo.

Nos vemos por aí!😉

Written by netmask

abril 18, 2009 às 13:31

Publicado em linux

Tagged with , , , ,

4 Respostas

Subscribe to comments with RSS.

  1. Thank you! Nice work!

    Gabriel

    abril 18, 2009 at 18:44

  2. […] pode encontrar o código compledo baixando o arquivo hello-tray.py. No artigo escrito em meu blog comento as partes mais importantes do código, de forma que você entenda o básico, e possa criar […]

  3. Parabéns cara, eu estava mesmo precisando de algo do tipo pra incrementar minhas aplicações em Python!!

    Até mais…

    Magnun

    abril 22, 2009 at 11:11

  4. Muito bom o tutorial! Confesso que não entendo muito de Pyton (ainda…rs), mas achei fantástica a idéia de se implementar essa solução. Existem muitas aplicações simples que poderiam ficar melhores com um ícone na bandeja…um exemplo é um assistente simples de conexão wifi (via wpa_supplicant), parecido com o Networkmanager que pretendo fazer para utilizar no meu slackware, já que essa distro não possui uma ferramenta simples de conexão wireless.

    Abraço e parabéns pelo tutorial !

    Vinicius

    abril 29, 2009 at 23:01


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: