将任意 gtk.Widget 放入 appindicator.Indicator

将任意 gtk.Widget 放入 appindicator.Indicator

将任何 gtk.Widget 放入 gtk.Menu 中,通过先放入一个空的 gtk.MenuItem,可以在一定程度上发挥作用。这似乎不太可靠 - 但基本上是可行的。使用 appindicator.Indicator 时,它不起作用。条目保持为空。例如,即使您将 child[border_size] 设置为 32。

唯一可以工作的窗口小部件是 gtk.Label(当然还有 MenuItem、ImageMenuItem 等等)。

现在 Me Menu 中有一个 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()

答案1

应用程序指示器菜单支持基于 D-Bus 菜单,其支持的内容有限 - 它们仅支持基本菜单功能,而不支持任意小部件等更奇特的功能。

他们支持此类功能的一个重大障碍是应用程序指示器菜单由另一个进程(应用程序指示器进程)呈现,因此您的程序无法直接在其上绘制任何内容。要克服这个问题,要么需要在 D-Bus 菜单中支持类似 X-Embed 的功能,要么允许所有 GTK 通过 D-Bus 工作。

答案2

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

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

相关内容