Como programar um ícone de status que será exibido no Ubuntu, bem como em outras distribuições?

23

O aplicativo em questão faz alguma ação (aqui conectando o áudio aos fluxos de rede) e é executado minimizado se essas ações forem bem-sucedidas. Portanto, um ícone de status é necessário para exibir o estado da conexão (por exemplo, CONNECTED / DISCONNECTED). Somente ao clicar no ícone, a janela do aplicativo será aberta para dar acesso a outras opções.

Usando o Python 2.6 e pyGtk eu convenientemente percebi isso usando gtk_status_icon . Eu deliberadamente escrevi o aplicativo para rodar em tantas distribuições quanto possível incluindo as várias versões do Ubuntu. Tomei o cuidado de usar possíveis dependências somente depois que o usuário as instalou.

No entanto, agora ouvi dizer que o gtk_status_icon não será mais suportado em versões futuras do Ubuntu. Os desenvolvedores são convidados a usar indicadores de aplicativos. Qual é então a melhor prática para se certificar de que:

  1. Os ícones locais do aplicativo são exibidos corretamente
  2. O aplicativo ainda será executado e exibirá seus ícones em versões futuras do Ubuntu.
  3. O aplicativo também é executado e exibe seus ícones em outros ambientes onde indicador-applet , libappindicator e python-appindicator não são fornecidos.

Os mecanismos de fallback de indicador de aplicativo para gtk_status_icon não funcionarão se o indicador-applet não estiver em execução. Os interpretadores Python não serão executados se não houver um módulo appindicator para importar. Preciso desenvolver versões diferentes para diferentes distribuições ou existe uma maneira melhor de resolver isso?

Onde eu encontro uma documentação sobre como usar ApplicationIndicator diferente do exemplo dado em Ubuntu Wiki ? Quais comandos são fornecidos para verificar se o indicador-applet está sendo executado para evitar a programação de códigos-fonte diferentes para distribuições Ubuntu versus não-Ubuntu?

    
por Takkat 14.11.2010 / 13:56

4 respostas

16

Eu acho que a necessidade aqui é realmente mais determinante da biblioteca python-appindicator estar presente. Se estiver presente, ele suportará todos os casos de fallback de que você precisa. Ele irá lidar com o XFCE, o KDE e o GNOME mais antigo apropriadamente. Bom exemplo de como fazer isso nesta resposta .

A biblioteca do appindicator usará o DBus para verificar se o processo de renderização do indicador do aplicativo está disponível. Este será o caso em Unity, ou se o indicador está em execução. Se estiver disponível, usará isso, se não, ele usará um GtkStatusIcon com o mesmo menu.

Infelizmente, acredito que você teria que manter os dois caminhos de código se quiser lidar com o caso da biblioteca não estar disponível. Porém, ficaríamos felizes em ajudar a obter a biblioteca em outras distros:)

    
por Ted Gould 15.11.2010 / 16:42
10

Tenho uma solução excelente que funcionou bem em StackApplet - criei uma versão funcionalmente equivalente do módulo appindicator que usa gtk.StatusIcon internamente para fornecer funcionalidade idêntica quando o módulo real não existe.

Utilizar é tão simples como:

  1. Fazer o download do arquivo a seguir e chamá-lo %código%
  2. Adicionando o seguinte ao seu aplicativo:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator
    

É isso! Agora seu aplicativo será executado perfeitamente com ou sem suporte para AppIndicators. Ele será executado até mesmo no Windows, supondo que você não tenha nenhum outro código específico da plataforma.

Nota: o arquivo é liberado sob a licença MIT - assim você pode usá-lo praticamente para qualquer coisa.

    
por Nathan Osman 11.05.2011 / 02:04
9

Você precisará escrever código para ambos. Você pode detectar a presença de appindicator no seu código Python usando algo semelhante a:

have_appindicator = True
try:
    import appindicator
except:
    have_appindicator = False

A partir daí, use o has_appindicator para decidir se você deve usar o código do appindicator ou o código gtk_status_icon.

Infelizmente, isso também significa que você precisará ter um Ubuntu e outro ambiente para testar.

    
por jgoguen 14.11.2010 / 15:06
3
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

applet_is_running = ( process.find('indicator-applet') > 0 )

Dessa forma, você pode detectar se o applet indicador está sendo executado. Você não precisa se preocupar com o Ubuntu 11.04 porque este não será o caso. Não há cenário de fallback porque o indicador-applet é um componente obrigatório, sendo executado por padrão.

    
por OpenNingia 15.11.2010 / 10:28