it-swarm.com.de

Beliebiges gtk.Widget in einen appindicator.Indicator setzen

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

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, müsste 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.

7

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.

2
c_korn