所以我一直在尝试将一个C GNOME applet移植到MATE,在遇到许多不同的问题之后,我决定在python中从头开始重写它。最后,我找到了一些不太可怕的过时文档,其中包括:http://wiki.mate-desktop.org/docs:devel:mate-panel
显然,在python中编写applet的新方法是使用PyGObject内省,而不是使用'旧'PyGtk。
所以我有几个问题:
1. Why is it better to use PyGObject instead of PyGtk etc
2. Is the end user who downloads a python applet expected to have pygobject installed? It looks like it.
3. The MATE documentation says 'ensure we are using Gtk 2, not Gtk3', but http://python-gtk-3-tutorial.readthedocs.org/en/latest/install.html says that its exclusively supports Gtk+ 3 and higher.
编辑:如果我跑
import gi
gi.require_version("Gtk", "2.0")
在python会话中,我收到警告:
RuntimeWarning: You have imported the Gtk 2.0 module. Because Gtk 2.0 was not designed for use with introspection some of the interfaces and API will fail. As such this is not supported by the pygobject development team and we encourage you to port your app to Gtk 3 or greater. PyGTK is the recomended python module to use with Gtk 2.0
这几乎回答了问题3,但随后再次提出问题1。此外,即使我安装了libmatepanelapplet-dev,运行from gi.repository import MatePanelApplet
也会产生ImportError Could not find any typelib for MatePanelApplet
。
再次编辑:我在这里找到了一个针对ImportError的解决方案:Can't import Webkit from gi.repository。 (只需安装gir1.2-mate-panel
而不是webkit)
还有更多错误:
./xmonad-log-applet.py:66: Warning: g_closure_set_marshal: assertion `closure != NULL' failed
applet = MatePanelApplet.Applet()
(xmonad-log-applet.py:10928): GLib-GIO-CRITICAL **: g_dbus_connection_register_object: assertion `G_IS_DBUS_CONNECTION (connection)' failed
Segmentation fault (core dumped)
答案 0 :(得分:3)
MATE是GNOME 2的一个分支,因此你应该使用PyGTK(作为你得到的消息)。
关于每个问题:
PyGObject更好,因为你只需要一个单独的绑定到一个库(提供内省的那个),你就可以自动访问每个支持GOBject Introspection的库的公共API。对于开发人员而言是好的,因为他们可以访问与C相同的API而无需等待每个新版本的绑定。
是。但用户可能会有。 GNOME 3的几率为100%,GNOME 2(MATE)较少,因为它不是必需的。
看起来不像是一个问题。正如我之前所说,MATE是GNOME 2的用户,因此你必须使用GNOME 2可用的库和文档。
您可以检查在Python中为GNOME 2编写的applet(在GNOME删除Bonobo之后)。例如,hasmter。您可能需要更改一些名称,可能在MATE中将库名称从GNOME重命名为MATE。