将任意的gtk.Widget放入appindicator.Indicator中。

将任何gtk.Widget放入gtk.Menu中,通过首先放置一个空的gtk.MenuItem可以实现某种程度的工作。但它似乎不是可靠的-但基本上可以工作。使用appindicator.Indicator时,它不起作用。条目仍然保持为空。即使您将child [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()

正如@MarcoCeppi提醒我一样,是的 - 这本来不应该起作用。我只是希望和梦想,也许它能够实现。因为“Me菜单”似乎做了类似的事情。 - Stefano Palazzo
1我非常确定Me菜单使用了libido(指示器显示对象)来实现这一点。请参考:https://launchpad.net/ido 特别是idoentrymenuitem.c(http://bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/head:/src/idoentrymenuitem.c)。不幸的是,我认为没有Python绑定。您可能想在ayatana-dev邮件列表上提问。 - andrewsomething
你弄清楚怎么做了吗?我也遇到了同样的问题。谢谢。 - neydroydrec
2个回答

应用程序指示器菜单支持基于D-Bus菜单,它们在支持方面有限制-它们只支持基本的菜单功能,而不支持更奇特的东西,如任意小部件。
其中一个重要的障碍是应用程序指示器菜单由不同的进程渲染,即应用程序指示器进程,因此您的程序无法直接在其上绘制任何内容。要克服这个问题,需要在D-Bus菜单中支持类似X-Embed的功能,或者允许GTK完全在D-Bus上工作。