
Das Einfügen eines beliebigen gtk.Widgets in ein gtk.Menu funktioniert einigermaßen, indem man zuerst ein leeres gtk.MenuItem einfügt. Das scheint nicht zuverlässig zu sein – aber grundsätzlich funktioniert es. Mit einem appindicator.Indicator funktioniert es nicht. Der Eintrag bleibt einfach leer. Selbst wenn man child[border_size] beispielsweise auf 32 setzt.
Das einzige Widget, das funktioniert, ist ein gtk.Label (plus natürlich MenuItem, ImageMenuItem usw.).
Da das Menü „Ich“ nun einen gtk.Entry enthält, muss es doch möglich sein, dies ordnungsgemäß durchzuführen. Wie mache ich das?
Hier ist ein Beispielcode, der erklärt, wovon ich rede:
self.item = gtk.MenuItem()
self.item.add(gtk.Label("hello world!"))
self.menu.append(self.item)
Der obige Code funktioniert, dieser hier jedoch nicht:
self.item = gtk.MenuItem()
self.item.add(gtk.Entry())
self.menu.append(self.item)
Wobei self.menu ein Appindicator.Indicator ist; wäre es ein gtk.Menu, würde zumindest der Eintrag angezeigt.
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()
Antwort1
Die Unterstützung des Anwendungsindikatormenüs basiert auf D-Bus-Menüs, die in ihrer Unterstützung eingeschränkt sind – sie unterstützen nur grundlegende Menüfunktionen, keine exotischeren Dinge wie beliebige Widgets.
Ein erhebliches Hindernis für die Unterstützung solcher Dinge ist die Tatsache, dass das Anwendungsanzeigemenü von einem anderen Prozess, dem Anwendungsanzeigeprozess, gerendert wird, sodass Ihr Programm keinen Zugriff hat, um direkt etwas darauf zu zeichnen. Um dies zu überwinden, müsste entweder etwas wie X-Embed in D-Bus-Menüs unterstützt werden oder GTK vollständig über D-Bus funktionieren.
Antwort2
Der Sound-Indikator 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 verwenden soll. Ich wollte einen Soundindikator schreiben, mit dem ich die Lautstärke pro App steuern kann, so wie es Pavucontrol kann.