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

23

O aplicativo em questão executa alguma ação (aqui conectando o áudio aos fluxos de rede) e é executado minimizado se essas ações forem bem-sucedidas. Portanto, é necessário um ícone de status 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 mais opções.

Usando Python 2.6 e pyGtk, percebi isso convenientemente usando gtk_status_icon . Eu escrevi deliberadamente o aplicativo para executar o maior número possível de distribuições, 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 devem usar os Indicadores de aplicativo. Qual é a melhor prática para garantir 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 será executado e exibirá seus ícones em outros ambientes onde o applet de indicador , o libappindicator e o python-appindicator não são fornecidos.

Os mecanismos de fallback do Indicador de Aplicativo para gtk_status_icon não funcionarão se o applet de indicador não estiver em execução. Os intérpretes Python não serão executados se não houver um módulo appindicator para importar. Preciso desenvolver versões diferentes para distribuições diferentes ou existe uma maneira melhor de contornar isso.

Onde encontro uma documentação sobre como usar o ApplicationIndicator, exceto no exemplo dado no Ubuntu Wiki ? Quais comandos são fornecidos para verificar se o applet de indicador está em execução para evitar a programação de códigos-fonte diferentes para distribuições Ubuntu vs. não Ubuntu?

Takkat
fonte

Respostas:

16

Eu acho que a necessidade aqui é realmente mais determinante da biblioteca python-appindicator. Se estiver presente, ele oferecerá suporte a todos os casos de fallback necessários. Ele manipulará o XFCE, o KDE e o GNOME mais antigo adequadamente. Bom exemplo de como fazê-lo nesta resposta .

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

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

Ted Gould
fonte
Obrigado por esta resposta muito clara. Isso indica o caminho que terei que seguir se quiser que meu aplicativo seja executado no 11.04. Eu tenho um caminho de trabalho para o GtkStatusIcon, mas precisarei desenvolver tudo novamente para o applet de indicador. Se eu entendi o seu comentário sobre o bug # 668375, é possível usar meus ícones locais sem precisar criar um tema inteiro para ícones, posso?
Takkat 15/11/10
Tendo tido tempo de mergulhar na programação do AppIndicator, descobri que usar a sugestão de jgoguen para verificar o módulo appindicator realmente não ajuda, porque os ícones personalizados não serão renderizados no 10.04 LTS. Veja meus comentários ao bug # 668375.
Takkat
Minha resposta inclui uma maneira muito fácil de resolver esse problema. Funcionou muito bem para o meu aplicativo e até tornou indolor portar um aplicativo que usa AppIndicators para Windows!
Nathan Osman
10

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

Usá-lo é tão simples quanto:

  1. Fazendo o download do seguinte arquivo e chame-oappindicator_replacement.py
  2. Adicionando o seguinte ao seu aplicativo:

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

É isso aí! Agora, seu aplicativo será executado perfeitamente com ou sem suporte para AppIndicators. Ele ainda será executado 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 - para que você possa usá-lo praticamente para qualquer coisa.

Nathan Osman
fonte
9

Você precisará escrever o 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 have_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.

jgoguen
fonte
1
Ainda assim, pode haver ambientes em que python-appindicator está instalado, mas o applet de indicador não está sendo executado. O aplicativo precisaria lidar com isso também.
Takkat 14/11/10
Para esse caso, consulte wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > Fallbacks personalizados. Por padrão, você receberá um gtk.StatusIcon para o indicador de aplicativo, se não houver nenhum applet de indicador presente.
htorque
Estou ciente da opção de fallback. O que não entendo é que, se o applet de indicador não estiver em execução, como o applet de indicador pode fornecer um fallback?
Takkat 14/11/10
Eu imagino que ele simplesmente verifique o applet de indicador e forneça a funcionalidade gtk_status_icon nos bastidores.
jgoguen
1
@jgoguen: o que é "isso"? Entendo que, a partir do 11.04, o Ubuntu / Unity não suportará mais o gtk_status_icon. Outras distribuições podem não ter "it". Estou realmente preocupado com isso.
Takkat 15/11/10
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 de indicador está em execução. 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 applet de indicador é um componente obrigatório, executando por padrão.

OpenNingia
fonte
Obrigado por apontar para obter o PID do applet de indicador (eu já faço isso para outras dependências possíveis usando o pidof), essa seria uma maneira reconhecidamente menos elegante se nada melhor estivesse disponível. Tanto quanto eu posso ver, o applet indicador está sendo executado com unidade de maneira confiável somente se os requisitos de hardware forem atendidos. Os usuários poderão inicializar no GNOME 2D e podem decidir não executar o applet de indicador. No entanto, isso pode não ser o meu problema então.
Takkat 15/11/10
Concordo com você que pode não ser 'elegante' (mas você pode adicionar todos os cosméticos que deseja: D), no entanto, deve funcionar. Pessoalmente eu prefiro soluções que funciona bem e elegância vem em segundo lugar :)
OpenNingia
Esta tarefa não parece estar em execução no meu sistema 14.04. A abordagem foi substituída? Existem muitas /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-servicetarefas.
halfer