Placer un gtk.Widget arbitraire dans un appindicator.Indicator

18

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.).

Maintenant, le menu Moi contient un gtk.Entry, il doit donc sûrement être possible de le faire correctement. Comment je le fais?

Voici un exemple de code pour expliquer mon sujet:

    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 indicateur.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()
    
posée Stefano Palazzo 06.12.2010 - 15:25
la source

2 réponses

7

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

L'un des obstacles les plus importants pour eux est le fait que le menu des indicateurs 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 résoudre ce problème, 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.

    
réponse donnée Michael Ekstrand 06.12.2010 - 15:46
la source
2

L’indicateur de son dans Ubuntu a des curseurs pour le volume et je me suis demandé comment cela était possible. Après avoir jeté un coup d’œil dans le code, il semble que GtkMenus puisse être rempli via dbus: lien

Mais je ne sais pas comment les utiliser. Je voulais écrire un indicateur sonore permettant de contrôler le volume par application, comme le ferait Pavucontrol.

    
réponse donnée c_korn 24.04.2016 - 02:15
la source

Lire d'autres questions sur les étiquettes