Mettre n'importe quel gtk.Widget à l'intérieur d'un gtk.Menu fonctionne, en quelque sorte, en mettant un gtk.MenuItem vide en premier. Cela ne semble pas fiable - mais cela fonctionne essentiellement. Avec un indicateur, l'indicateur ne fonctionne pas. L'entrée reste simplement vide. Même si vous définissez l'enfant [border_size] sur 32, par exemple.
Le seul widget qui fonctionne est un gtk.Label (plus le MenuItem, ImageMenuItem et ainsi de suite bien sûr).
Maintenant, le menu Me a un gtk.Entry dedans, donc il doit sûrement être possible de le faire correctement. Comment fait-on ça?
Voici un exemple de code pour expliquer de quoi je parle:
self.item = gtk.MenuItem()
self.item.add(gtk.Label("hello world!"))
self.menu.append(self.item)
Le code ci-dessus fonctionne, mais cela ne fonctionne pas:
self.item = gtk.MenuItem()
self.item.add(gtk.Entry())
self.menu.append(self.item)
Où self.menu est un appindicator.Indicator, s'il s'agissait d'un gtk.Menu, l'entrée serait au moins affichée.
Voici un code de travail:
import gtk
import appindicator
class AppIndicator (object):
def __init__(self):
self.ind = appindicator.Indicator("hello world client",
"distributor-logo", appindicator.CATEGORY_APPLICATION_STATUS)
self.ind.set_status (appindicator.STATUS_ACTIVE)
self.menu = gtk.Menu()
item = gtk.MenuItem()
item.add(gtk.Label("hello world"))
# item.add(gtk.Entry())
self.menu.append(item)
self.menu.show_all()
self.ind.set_menu(self.menu)
indicator = AppIndicator()
gtk.main()
Réponses:
La prise en charge du menu Indicateur d'application est basée sur les menus D-Bus, qui sont limités dans ce qu'ils prennent en charge - ils ne prennent en charge que les fonctionnalités de menu de base, pas des choses plus exotiques telles que des widgets arbitraires.
Un obstacle important à leur prise en charge de telles choses est le fait que le menu d'indicateur d'application est rendu par un processus différent, le processus d'indicateur d'application, de sorte que votre programme n'a pas accès pour dessiner directement quoi que ce soit dessus. Pour surmonter cela, il faudrait soit prendre en charge quelque chose comme X-Embed dans les menus D-Bus, soit permettre à GTK de fonctionner sur D-Bus.
la source
L'indicateur de son dans Ubuntu a des curseurs pour le volume et je me demandais comment c'était possible. Après un coup d'œil dans le code, il semble qu'il existe des menus Gtk qui peuvent être remplis via dbus en attendant: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html
Mais je ne sais pas comment les utiliser. Je voulais écrire un indicateur sonore où je peux contrôler le volume par application, tout comme pavucontrol peut le faire.
la source