web-dev-qa-db-fra.com

Mettre un gtk.Widget arbitraire dans un appindicator.Indicator

Mettre tout gtk.Widget dans un gtk.Menu fonctionne, en quelque sorte, en plaçant un gtk.MenuItem vide en premier. Cela ne semble pas fiable - mais cela fonctionne fondamentalement. Avec un appindicator.Indicator, cela 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 MenuItem, ImageMenuItem, etc. bien sûr).

Maintenant, le menu Moi contient un gtk.Entry, il doit donc sûrement être possible de le faire correctement. Comment fait-on ça?

Voici un exemple de code pour expliquer mon propos:

    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()
18
Stefano Palazzo

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.

Un obstacle important pour eux qui supportent 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 à quoi que ce soit qui y soit directement dessiné. Pour surmonter cela, il faudrait soit prendre en charge quelque chose comme X-Embed dans les menus de D-Bus ou permettre à tout GTK de fonctionner sur D-Bus.

7
Michael Ekstrand

L’indicateur de son dans Ubuntu a des curseurs pour le volume et je me suis demandé comment cela était possible. Après avoir regardé dans le code, il semble que GtkMenus puisse être rempli via dbus: 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.

2
c_korn