使用 Python 在 App Indicators 中使用 Gtk.Widgets

Ser*_*nyy 45 indicator python application-development

在 2010 年 Stefano Palazzo 提出了一个相关的问题,将任意 gtk.Widget 放入 appindicator.Indicator 中,并且在StackOverflow上也提出了类似的问题。在这两种情况下,共识是 Ubuntu 的应用程序指标是有限的。正如迈克尔·埃克斯特兰德所说:

Application Indicator 菜单支持基于 D-Bus 菜单,它们支持的内容有限——它们只支持基本的菜单功能,不支持更多奇特的东西,比如任意小部件。

然而,它与我们今天在 2016 年看到的蓝牙指示器相矛盾:它使用拨动开关。

在此处输入图片说明

13.04 中的 Ubuntu One 指标也可以观察到相同的情况:

在此处输入图片说明

所以显然有办法。我研究了指标蓝牙源代码,但它是用 Vala 编写的。但是,我主要使用 Python 工作,学习 Vala 只是为了重写我现有的所有指标,工作量太大了。

所以问题的核心是:如何使用 Python 使用 Gtk.Widgets,或者至少像蓝牙指示器中的切换开关一样?

注意:我愿意在这个问题上悬赏以奖励一个答案,该答案将在 python 中提供一个工作示例。不接受其他语言。

Mar*_*mo- 3

之所以存在这个问题,是因为虽然 AppIndicators 可以轻松创建指示器菜单,但它们确实妨碍了创建指示器菜单。让我们看一下使用 AppIndicator 的示例 Python 代码与使用 GLib 菜单(如蓝牙代码的方式)的示例 Python 代码之间的差异。

首先,您将被指示创建一个gtk.Menu,这些是旧式 Gtk 菜单对象,Gtk.Action现在已弃用。gtk.MenuAppIndicator在此过程中从您那里获取对象set_menu(...)并解析它,将它找到的每个菜单推送到使用创建的指示器服务上libdbusmenu。这个解析过程意味着无论您做什么,AppIndicator 不支持的任何内容都会被过滤掉。

接下来让我们看看蓝牙菜单。这是使用Gio.Menu对象创建的,这些是使用系统的新型 Gnome 菜单GActionAppIndicator然后,它在不使用or 的情况下注册了自己的服务libdbusmenu,并使用自定义x-canonical-type属性来创建传递给解析的开关小部件来设置它libido

整个练习非常糟糕,因为它都是 Canonical 自己的 Unity 定制。因此,一旦统一结束,就不再有应用程序了。