使用 PyGObject 获取 GDBusMenuModel 的菜单项

Posted

技术标签:

【中文标题】使用 PyGObject 获取 GDBusMenuModel 的菜单项【英文标题】:Get menu entries of GDBusMenuModel with PyGObject 【发布时间】:2017-10-23 22:16:27 【问题描述】:

所以因为我安装了unity-gtk-module,所有的gtk 应用程序都通过dbus SessionBus 导出它们的菜单。我的目标是提取所有可用菜单条目的列表。我已经在 pydbus 的帮助下实现了这一点,但由于某种原因,这个解决方案非常不稳定,一些应用程序直接崩溃了。 unity-gtk-module 使用 Gio 的 g_dbus_connection_export_menu_model () 通过 dbus 导出其 GMenuModel 建模菜单,所以我认为尝试使用 Gio 处理导出的菜单是有意义的。 Gio 使用GDBusMenuModel 类从总线检索菜单。 Python 使用 PyGObject 来包装 Gio:

from gi.repository import  Gio
connection = Gio.bus_get_sync(Gio.BusType.SESSION, None)
menuModel = Gio.DBusMenuModel.get(connection, [bus-name e.g. ":1.5"], [object-path e.g. "/com/canonical/unity/gtk/window/0"])

现在 menuModel 应该从我的应用程序中包装 GMenuModel。在这一点上,老实说,我对 GMenuModel 的工作原理有点困惑(Description 并没有真正的帮助),但似乎我必须使用GMenuAttributeIter 对象来遍历条目。但是当我尝试这个时:

iter = Gio.MenuModel.iterate_item_attributes(menuModel, 0) #0 is the index of the root node

发生这种情况:

GLib-GIO-CRITICAL **: g_dbus_menu_model_get_item_attributes: assertion 'proxy->items' failed
GLib-GIO-CRITICAL **: GMenuModel implementation 'GDBusMenuModel' doesn't override iterate_item_attributes() and fails to return sane calues from get_item_attributes()

这可能是因为 GDBusMenuModel 继承了提供这些方法的 GMenuModel,但它是抽象的,所以 GDBusMenuModel 应该覆盖它们,但它没有(见上面的链接,它只提供 g_dbus_menu_model_get ())。如果是这种情况,我应该如何实际使用这个类作为代理?如果不是,我做错了什么?

【问题讨论】:

【参考方案1】:

几年后我第一次登录 SO,并记得我实际上已经找到了解决这个问题的方法(我认为)。老实说,我什至不记得这些词的一半是什么意思,但当时我写了一个脚本来完成标题中提出的任务,据我记得,最后,它成功了:https://gist.github.com/encomiastical/caa0ee955300bc2a40ef55d123b06212

【讨论】:

以上是关于使用 PyGObject 获取 GDBusMenuModel 的菜单项的主要内容,如果未能解决你的问题,请参考以下文章

PyGObject标签问题

如何使用 PyGObject 使窗口居中

用 pygobject 编写 D-Bus 服务?

如何使用 GTK3 和 PyGObject 绘制 GdkPixbuf

在 PyGObject 中使用 GtkSourceView 从 Glade 加载 GUI

python SITCON 2018中使用的PyGObject示例。