web-dev-qa-db-fra.com

Utilisation de Gtk.Widgets dans les indicateurs d'application avec Python

En 2010, Stefano Palazzo a posé une question connexe, Mettre un gtk.Widget dans un appindicator.Indicator , et une question similaire a été posée sur StackOverflow . Dans les deux cas, le consensus est que les indicateurs d'application d'Ubuntu sont limités. Comme Michael Ekstrand l'a dit:

La prise en charge du menu Indicateur d'application est basée sur les menus D-Bus, limités dans ce qu'ils supportent: ils ne prennent en charge que la fonctionnalité de menu de base, pas des éléments plus exotiques tels que des widgets arbitraires.

Cependant, il contredit ce que nous voyons dans l'indicateur Bluetooth aujourd'hui, en 2016: il utilise des commutateurs à bascule.

enter image description here

La même chose pourrait être observée avec Ubuntu Un indicateur à partir de 13.04:

enter image description here

Alors évidemment, il y a un moyen. J'ai étudié le code source Bluetooth-Indicator, mais il est écrit en vala. Cependant, je travaille principalement en python, et apprendre Vala à réécrire tous mes indicateurs existants est un peu trop de travail.

Donc, l’essentiel de la question: Comment utiliser Gtk.Widgets, ou au minimum un interrupteur à bascule comme dans l’indicateur Bluetooth, en utilisant Python?

NOTE: Je suis disposé à mettre à profit cette question pour récompenser une réponse qui fournira un exemple concret en python . Les autres langues ne sont pas acceptées.

44
Sergiy Kolodyazhnyy

Ce problème existe car, bien qu'AppIndicators facilite la création d'un menu d'indicateurs, ils les empêchent de les créer. Examinons les différences entre le code exemple python utilisant AppIndicator et le code utilisant les menus GLib, comme le fait le code Bluetooth.

Tout d’abord, vous êtes invité à créer un gtk.Menu, ce sont des objets de menu de style Gtk de style ancien qui utilisent Gtk.Action et qui sont maintenant obsolètes. AppIndicator prend l'objet gtk.Menu auprès de vous pendant le processus set_menu(...) et le analyse, en poussant chacun des menus qu'il trouve sur le service d'indicateur créé à l'aide de libdbusmenu. Ce processus d'analyse signifie que tout ce qui n'est pas pris en charge par AppIndicator est filtré, quoi que vous fassiez.

Ensuite, regardons le menu Bluetooth. Créé à l’aide des objets Gio.Menu, il s’agit de nouveaux menus de style Gnome utilisant le système GAction. Il a ensuite enregistré son propre service sans utiliser AppIndicator ou libdbusmenu et l'a défini en utilisant une propriété personnalisée x-canonical-type pour créer le widget de commutateur qui est passé à libido pour l'analyse.

Tout cet exercice est plutôt mauvais, car ce sont toutes les personnalisations Unity de Canonical. Donc, dès que l’unité disparaît, il n’ya pas d’indicateur.

1