Usando Gtk.Widgets em indicadores de aplicativo com Python

44

Em 2010, Stefano Palazzo fez uma pergunta relacionada, Colocando um gtk.Widget arbitrário em um appindicator.Indicator , e um similar foi perguntado no StackOverflow . Em ambos os casos, o consenso é que os Indicadores de App do Ubuntu são limitados. Como Michael Ekstrand colocou:

  

O suporte do menu Indicador de aplicativos é baseado nos menus do D-Bus, que   são limitados no que eles suportam - eles só suportam menu básico   funcionalidade, não mais coisas exóticas, como widgets arbitrários.

No entanto, isso contradiz o que vemos no indicador de Bluetooth hoje, em 2016: ele usa switches de alternância.

O mesmo pode ser observado com o indicador do Ubuntu One de 13.04:

Então, obviamente, há um caminho. Eu estudei código-fonte bluetooth-indicador, mas está escrito em Vala. Eu, no entanto, trabalho principalmente em python, e aprender Vala apenas para reescrever todos os meus indicadores já existentes é um pouco trabalhoso demais.

Assim, o núcleo da questão: Como alguém pode usar Gtk.Widgets, ou no mínimo um interruptor de alavanca como no indicador de Bluetooth, usando Python?

NOTA : Estou disposto a colocar recompensas nesta questão para recompensar uma resposta que fornecerá um exemplo de trabalho em python . Outros idiomas não são aceitos.

    
por Sergiy Kolodyazhnyy 01.10.2016 / 02:55

1 resposta

1

Esse problema existe porque, embora os AppIndicators facilitem a criação de um menu de indicadores, eles atrapalham a criação de um. Vejamos as diferenças entre o código python de exemplo usando o AppIndicator e o outro usando o GLib Menus como o código Bluetooth faz.

Primeiramente, você é instruído a fazer um gtk.Menu , esses são objetos de menu Gtk do estilo antigo que usam Gtk.Action e agora estão obsoletos. O AppIndicator pega o objeto gtk.Menu de você durante o processo set_menu(...) e o analisa, pressionando cada um dos menus que encontra no serviço de indicador criado usando libdbusmenu . Este processo de análise significa que qualquer coisa não suportada pelo AppIndicator é filtrada, não importa o que você faça.

Em seguida, vamos ver o menu Bluetooth. Isso é criado usando Gio.Menu objetos, estes são novos menus estilo Gnome usando o sistema GAction . Em seguida, registrou seu próprio serviço sem usar AppIndicator ou libdbusmenu e configurou o uso de uma propriedade x-canonical-type personalizada para criar o widget de comutação que é passado para libido para análise.

Todo este exercício é muito ruim, já que são todas as personalizações Unity da Canonical. Então, assim que a unidade for, não haverá appindicators de qualquer maneira.

    
por Martin Owens -doctormo- 28.07.2017 / 20:36