使用PyGObject获取GDBusMenuModel的菜单项

问题描述 投票:3回答:1

因此,因为我安装了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())。如果是这种情况,我应该如何实际使用此类作为代理?如果不是,那我在做什么错?

python dbus pygobject gio
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.