将任意gtk.Widget放入appindicator.Indicator


18

将任何gtk.Widget放在gtk.Menu内,某种程度上是通过首先将一个空的gtk.MenuItem放入而起作用的。它似乎并不可靠-但它基本上可以工作。使用appindicator.Indicator无效。条目保持为空。例如,即使将child [border_size]设置为32。

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

现在,我菜单中有一个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提醒我,是的-这是不应该工作。我只是希望和梦想,也许可以。由于“我的菜单”功能看似相似。
Stefano Palazzo

1
我很确定我菜单使用libido(指示器显示对象)来做到这一点。请参阅:launchpad.net/ido特别是idoentrymenuitem.c(bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/…)。不幸的是,我认为没有python绑定。您可能要在ayatana-dev电子邮件列表中询问。
andrewsomething 2010年

您是否知道如何执行此操作?我正面临着同样的问题。谢谢。
本杰明·

Answers:


7

Application Indicator菜单支持基于D-Bus菜单,但其支持方式受到限制-它们仅支持基本菜单功能,而不支持更多奇特的东西,例如任意小部件。

他们曾经支持此类事情的一个重要障碍是,应用程序指示符菜单由不同的进程(应用程序指示符进程)呈现,因此您的程序无权直接在其上绘制任何内容。克服这个问题需要支持D-Bus菜单中的X-Embed之类的功能,或者允许所有GTK都可以通过D-Bus进行工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.