De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Mauricio Teixeira
Data de Publicação: 07 de Maio de 2009
É 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í! ;)
O artigo foi originalmente publicado em http://mteixeira.webset.net/blog/20090418/aplicacao-na-area-de-notificacao-do-gnome-em-python-portugues/
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários