2010 年 Stefano Palazzo 提出了一个相关问题,将任意 gtk.Widget 放入 appindicator.Indicator,还有类似的问题堆栈溢出。在这两种情况下,大家一致认为 Ubuntu 的应用程序指示器是有限的。正如 Michael Ekstrand 所说:
应用程序指示器菜单支持基于 D-Bus 菜单,其支持的内容有限 - 它们仅支持基本菜单功能,而不支持任意小部件等更奇特的功能。
然而,它与我们在 2016 年今天看到的蓝牙指示器相矛盾:它使用拨动开关。
从 13.04 版开始,我们可以观察到同样的 Ubuntu One 指标:
所以显然是有办法的。我研究过 indicator-bluetooth 源代码,但它是用 Vala 编写的。然而,我主要用 Python 工作,学习 Vala 只是为了重写我所有现有的指标,这有点太费劲了。
问题的核心是:如何使用 Gtk.Widgets,或者至少使用像蓝牙指示器中的切换开关,使用 Python?
笔记:我愿意对这个问题悬赏,以奖励能够提供有效示例的答案在 python 中. 不接受其他语言。
答案1
存在此问题的原因是,尽管 AppIndicators 可以轻松创建指示器菜单,但它们确实会妨碍创建指示器菜单。让我们看看使用 AppIndicator 的示例 Python 代码与使用 GLib 菜单(如蓝牙代码一样)的示例 Python 代码之间的区别。
首先,您需要制作一个gtk.Menu
,这些是使用 的旧式 Gtk 菜单对象,Gtk.Action
现已弃用。AppIndicatorgtk.Menu
在此set_menu(...)
过程中从您那里获取对象并对其进行解析,将其找到的每个菜单推送到使用 创建的指示器服务上libdbusmenu
。此解析过程意味着无论您做什么,AppIndicator 不支持的任何内容都会被过滤掉。
接下来让我们看看蓝牙菜单。它是使用Gio.Menu
对象创建的,这些是使用系统的新式 Gnome 菜单GAction
。然后它注册了自己的服务(不使用AppIndicator
或)libdbusmenu
,并使用自定义属性对其进行设置,x-canonical-type
以创建传递给它进行libido
解析的开关小部件。
整个过程非常糟糕,因为这些都是 Canonical 自己的 Unity 定制。因此一旦 Unity 消失,appindicators 就不存在了。