了解 gi.repository

13

我不太理解gi.repository。

我在我的代码中使用了这个构造。

from gi.repository import Gtk

但是如果我想使用一些组件,我会遇到导入错误。

我进行了搜索,并且对于一些组件(如GtkSource、Vte、GLib等),我已经解决了这个问题。

所以我的代码看起来像:

from gi.repository import Gtk, GtkSource, Vte, GLib

一切正常,但如果我想添加matplotlib来在我的画布上绘图,就会出现错误。

    enter code/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py:40: Warning: specified class size for type `PyGtkGenericCellRenderer' is smaller than the parent type's `GtkCellRenderer' class size
  from gtk import _gtk
/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py:40: Warning: g_type_get_qdata: assertion `node != NULL' failed
  from gtk import _gtk
/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py:40: Warning: g_ascii_strncasecmp: assertion `s2 != NULL' failed
  from gtk import _gtk
Segmentation fault (core dumped) here

我该如何让matplotlib与gi.repository一起工作?

谢谢

2个回答

13

看起来对于Gtk3的支持是最近添加的。我猜它要花一些时间才能在主要发行版中使用。

最好的解决方案是下载并安装最新版本。

为了避免在我的Ubuntu 11.10上安装东西,我下载了backend_gtk3.py和backend_gtk3agg.py文件并直接导入,如下所示:

from gi.repository import Gtk

from matplotlib.figure import Figure
from backend_gtk3agg import FigureCanvasGTK3Agg as FigCanvas

我不得不修改backend_gtk3agg.py文件的第6行,其中写着:

import backend_agg

使用

from matplotlib.backends import backend_agg

我希望能够从我的安装中导入模块。目前对于我来说它是有效的,但我明白这个解决方案无法适用于不同版本的matplotlib。


你好,你是说你只下载了两个文件吗?我正在尝试使用你所解释的步骤来运行这个例子:http://matplotlib.org/dev/examples/user_interfaces/embedding_in_gtk3.html,但是它不起作用。你能否再详细解释一下?另外,你是否使用本地matplotlib安装中的Figure? - Fabrizio

6

这是一个非常好的问题。恐怕答案可能是“你不能”。Matplotlib的GTK后端是为PyGTK编写的,这是GTK的旧式Python绑定。gi.repository包是新式Python绑定。我不知道它们是否可以混合使用,但您的结果似乎表明它们不能。


3
11个月前,一个采用新的gi.repository导入的GTK3后端被合并到了GitHub上:https://github.com/matplotlib/matplotlib/pull/590。我不确定哪个版本包含此后端,也不知道如何正确调用它,但是它“应该”是兼容的...不幸的是,最近我发现,在同一应用程序中无法同时使用这两个导入,否则会崩溃(段错误)。 - NoBugs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接