Beliebiges gtk.Widget in einen appindicator.Indicator setzen

18

Das Einfügen von gtk.Widget in ein gtk.Menu funktioniert in gewisser Weise, indem zuerst ein leeres gtk.MenuItem eingefügt wird. Es scheint nicht zuverlässig zu sein - aber es funktioniert im Grunde. Mit einem Indikator. Indikator funktioniert es nicht. Der Eintrag bleibt einfach leer. Auch wenn Sie beispielsweise das untergeordnete Element [border_size] auf 32 setzen.

Das einzige Widget, das funktioniert, ist ein gtk.Label (plus das MenuItem, ImageMenuItem und so weiter natürlich).

Jetzt hat das Me-Menü einen gtk.Entry, also muss es sicher möglich sein, dies richtig zu machen. Wie mache ich es?

Hier ist ein Beispielcode, um zu erklären, worüber ich rede:

    self.item = gtk.MenuItem()
    self.item.add(gtk.Label("hello world!"))
    self.menu.append(self.item)

Der obige Code funktioniert, dies jedoch nicht:

    self.item = gtk.MenuItem()
    self.item.add(gtk.Entry())
    self.menu.append(self.item)

Wenn self.menu ein appindicator.Indicator ist, wird der Eintrag zumindest angezeigt, wenn es sich um ein gtk.Menu handelt.

Hier ist ein funktionierender Code:

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()
Stefano Palazzo
quelle
Als @MarcoCeppi mich daran erinnert, ja - das ist nicht angeblich an die Arbeit. Ich hoffe nur und träume, vielleicht kann es. Da macht das Me-Menü etwas scheinbar Ähnliches.
Stefano Palazzo
1
Ich bin mir ziemlich sicher, dass das Me-Menü dazu die Libido (Indicator Display Objects) verwendet. Siehe: launchpad.net/ido Insbesondere idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/... ). Leider glaube ich nicht, dass es Python-Bindungen gibt. Möglicherweise möchten Sie auf der Ayatana-Dev-E-Mail-Liste fragen.
Andrewsomething
Haben Sie herausgefunden, wie das geht? Ich stehe vor dem gleichen Problem. Vielen Dank.
Benjamin

Antworten:

7

Die Menüunterstützung von Application Indicator basiert auf D-Bus-Menüs, deren Unterstützung begrenzt ist. Sie unterstützen nur grundlegende Menüfunktionen, keine exotischen Elemente wie beliebige Widgets.

Eine wichtige Hürde für sie, solche Dinge jemals zu unterstützen, ist die Tatsache, dass das Anwendungsindikator-Menü durch einen anderen Prozess, den Anwendungsindikator-Prozess, gerendert wird, sodass Ihr Programm nicht direkt darauf zugreifen kann. Um dies zu überwinden, muss entweder X-Embed in D-Bus-Menüs unterstützt werden, oder es muss allen GTK-Benutzern ermöglicht werden, über D-Bus zu arbeiten.

Michael Ekstrand
quelle
2

Die Sound-Anzeige in Ubuntu hat Schieberegler für die Lautstärke und ich habe mich gefragt, wie das möglich ist. Nach einem Blick in den Code scheint es GtkMenus zu geben, die mittlerweile über dbus gefüllt werden können: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Aber ich weiß nicht, wie ich sie benutzen soll. Wollte einen Soundindikator schreiben, mit dem ich die Lautstärke per App steuern kann, genau wie es pavucontrol kann.

c_korn
quelle