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


44

在2010年,Stefano Palazzo提出了一个相关问题,将任意一个gtk.Widget放入一个appindicator.Indicator中,在StackOverflow上也提出了类似的问题。在这两种情况下,共识是Ubuntu的App Indicators是有限的。正如Michael Ekstrand所说:

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

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

在此处输入图片说明

从13.04开始的Ubuntu One指标可以观察到相同的结果:

在此处输入图片说明

因此,显然有一种方法。我研究了指示器蓝牙源代码,但是它是用Vala编写的。但是,我主要使用python进行工作,而学习Vala来重写我已经存在的所有指标,则工作量太大。

因此,问题的核心是:如何使用Python使用Gtk.Widgets,或者至少像蓝牙指示器中那样使用拨动开关?

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


6
即使不支持动态图标,应用程序指示器也会受到限制(它只是从文件系统加载图像文件)。您提到的那些指示灯是SYSTEM指示灯(蓝牙,ubuntu指示灯,声音,电源等)。它们是不同的,并且它们没有使用libappindicator。我已经发布了一些帖子,可能有助于阐明两者之间的区别。我已经有一个使用C的系统指示器,但是在python中我仍然很挣扎。
user.dz

2
有没有办法吸引Ubuntu核心开发人员对此问题的关注?
don.joey

1
至少test = Gtk.CheckMenuItem("Monkey")可以添加一个检查按钮,但是应该更多。尽管该方法有效,但该方法应该有效,但不起作用: Gtk.CheckMenuItemToggled("Monkey")。我很确定它可以正常工作。请参阅:developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Jacob Vlijm,2016年

1
@JacobVlijm是,加入任何一个菜单项作品,它也可以添加Gtk.Box并添加Gtk.Label到那个盒子,但没有别的(它说小部件只能包含一个项目。
谢尔盖Kolodyazhnyy

1
Gtk.ImageMenuItem不建议使用,不建议使用btw:developer.gnome.org/gtkmm/stable/deprecated.html
Jacob Vlijm,2013年

Answers:


1

存在此问题的原因是,尽管AppIndicators可以轻松创建指标菜单,但它们确实妨碍了创建指标菜单。让我们看一下使用AppIndicator的示例python代码与使用蓝牙代码的GLib Menus的示例python代码之间的区别。

首先,系统指示您制作一个gtk.Menu,这些Gtk.Action是已淘汰的老式Gtk菜单对象。AppIndicator gtk.Menuset_menu(...)处理过程中从您那里获取对象并进行解析,将找到的每个菜单推送到使用创建的指标服务上libdbusmenu。此解析过程意味着无论您做什么,AppIndicator不支持的所有内容都会被过滤掉。

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

整个练习非常糟糕,因为它都是Canonical自己的Unity定制。因此,只要团结一致,就不会有止痛药。

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.