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 solicitado no StackOverflow . Nos dois casos, o consenso é que os Indicadores de Aplicativos do Ubuntu são limitados. Como Michael Ekstrand colocou:

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

No entanto, contradiz o que vemos no indicador Bluetooth hoje, em 2016: ele usa interruptores.

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

Portanto, o cerne da questão: como alguém pode usar o Gtk.Widgets ou, no mínimo, uma chave de alternância, como no indicador Bluetooth, usando Python?

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

Sergiy Kolodyazhnyy
fonte
6
O indicador de aplicativo é limitado, mesmo que não suporte o ícone em tempo real (apenas carrega o arquivo de imagem do sistema de arquivos). Esses indicadores que você mencionou são indicadores do sistema (bluetooth, ubuntu one, som, potência, ...). Eles são diferentes e não estão usando o libappindicator. Eu já publiquei alguns posts que podem ajudar a esclarecer a diferença. Eu já tenho um indicador de sistema trabalhando usando C., mas em python ainda estou lutando.
User.dz
2
Existe uma maneira de atrair a atenção dos desenvolvedores principais do Ubuntu para esta pergunta?
don.joey
1
Pelo menos test = Gtk.CheckMenuItem("Monkey")funciona adicionando um botão de verificação, mas deve haver mais. Enquanto que um funciona, este deve funcionar, mas não: Gtk.CheckMenuItemToggled("Monkey"). Tenho certeza de que pode funcionar de qualquer maneira. Veja: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Jacob Vlijm
1
@JacobVlijm sim, acrescentando quaisquer obras MenuItem individuais, que também trabalha para adicionar um Gtk.Box e adicionar Gtk.Label para que a caixa, mas nada mais (ele diz que o widget pode conter apenas um item.
Sergiy Kolodyazhnyy
1
Gtk.ImageMenuItemé obsoleto e desencorajados de usar btw: developer.gnome.org/gtkmm/stable/deprecated.html
Jacob Vlijm

Respostas:

1

Esse problema existe porque, embora o AppIndicators facilite a criação de um menu de indicadores, eles atrapalham a criação de um. Vejamos as diferenças entre exemplos de código python usando AppIndicator e um usando menus GLib da maneira que o código Bluetooth faz.

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

Em seguida, vejamos o menu Bluetooth. Isso é criado usando Gio.Menuobjetos, esses são os novos menus Gnome de estilo, usando o GActionsistema. Em seguida, registrou seu próprio serviço sem usar AppIndicatorou libdbusmenue configurou usando uma x-canonical-typepropriedade customizada para criar o widget de switch que é passado libidopara análise.

Todo esse exercício é muito ruim, pois são todas as personalizações da Unity da Canonical. Assim, assim que a unidade se desenvolve, não há indicadores de qualquer maneira.

Martin Owens -doctormo-
fonte