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

44

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

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.

entrez la description de l'image ici

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

entrez la description de l'image ici

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, avec Python?

NOTE : Je suis prêt à mettre prime sur cette question pour récompenser une réponse qui fournira un exemple de travail en python . Les autres langues ne sont pas acceptées.

Sergiy Kolodyazhnyy
la source
6
L’indicateur d’application est limité même si l’icône n’est pas prise en charge à la volée (elle ne charge que les fichiers image à partir du système de fichiers). Les indicateurs que vous avez mentionnés sont des indicateurs SYSTEM (Bluetooth, Ubuntu One, son, alimentation, ...). Ils sont différents et n'utilisent pas libappindicator. J'ai déjà posté quelques articles qui pourraient aider à clarifier la différence. J'ai déjà un indicateur système fonctionnant avec C. mais en python, je lutte toujours.
user.dz
2
Existe-t-il un moyen d'attirer l'attention des développeurs Ubuntu sur cette question?
don.joey
1
Au moins test = Gtk.CheckMenuItem("Monkey"), l’ajout d’une case à cocher est utile, mais il devrait y en avoir plus. Bien que que l' on travaille, celui - ci devrait fonctionner, mais ne fonctionne pas: Gtk.CheckMenuItemToggled("Monkey"). Je suis à peu près sûr que cela peut fonctionner de toute façon. Voir: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Jacob Vlijm
1
@JacobVlijm oui, en ajoutant n'importe quel menuitem, cela fonctionne également pour ajouter un Gtk.Box et ajouter Gtk.Label à cette case, mais rien d'autre (il dit que le widget ne peut contenir qu'un seul élément.
Sergiy Kolodyazhnyy
1
Gtk.ImageMenuItemest déconseillé et déconseillé d'utiliser btw: developer.gnome.org/gtkmm/stable/deprecated.html
Jacob Vlijm

Réponses:

1

Ce problème existe car, bien qu'AppIndicators facilite la création d'un menu d'indicateurs, ils empêchent d'en créer un. Examinons les différences entre un exemple de code python utilisant AppIndicator et un 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 utilisés Gtk.Actionqui sont maintenant obsolètes. AppIndicator prend l' gtk.Menuobjet de votre part pendant le set_menu(...)processus et l'analyse, en poussant chacun des menus trouvés 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 d' Gio.Menuobjets, il s'agit de nouveaux styles de menus Gnome utilisant le GActionsystème. Il a ensuite enregistré son propre service sans utiliser AppIndicatorni libdbusmenuand set, en utilisant une x-canonical-typepropriété personnalisée pour créer le widget de commutateur, qui est transmis à l' libidoanalyse.

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

Martin Owens -doctormo-
la source