将任意gtk.Widget放入appindicator.Indicator

将任何gtk.Widget放入gtk.Menu中,首先将空的gtk.MenuItem放入其中。 它似乎不可靠 – 但它基本上有效。 使用appindicator.Indicator,它不起作用。 该条目保持空白。 例如,即使将子[border_size]设置为32也是如此。

唯一有效的小部件是gtk.Label(当然还有MenuItem,ImageMenuItem等)。

现在Me菜单中有一个gtk.Entry,所以肯定可以正确地执行此操作。 我该怎么做?

这里有一些示例代码来解释我的内容:

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

上面的代码有效,但不是:

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

self.menu是appindicator.Indicator,如果是gtk.Menu,则至少会显示Entry。

这是一些有效的代码:

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

应用程序指示器菜单支持基于D-Bus菜单,它们受限于它们支持的内容 – 它们仅支持基本菜单function,而不是诸如任意小部件之类的更奇特的东西。

它们支持这些事情的一个重要障碍是应用程序指示器菜单由不同的进程(应用程序指示器进程)呈现,因此您的程序无权直接在其上绘制任何内容。 克服这个问题需要在D-Bus菜单中支持X-Embed或允许所有GTK在D-Bus上工作。

Ubuntu中的声音指示器有音量滑块,我想知道这是怎么回事。 在查看代码后,似乎有GtkMenus可以通过dbus同时填充: https : //developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

但我不知道如何使用它们。 想要写一个声音指示器,我可以控制每个应用程序的音量,就像pavucontrol可以做到的那样。