了解gi.repository

Jan*_*cak 12 python gtk matplotlib

我很难理解gi.repository

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

from gi.repository import Gtk
Run Code Online (Sandbox Code Playgroud)

但如果我想使用某些组件,我会导致导入错误

我搜索了一下,我得到了一些组件,比如GtkSource,Vte,GLib,......

所以我的代码就像

from gi.repository import Gtk, GtkSource, Vte, GLib
Run Code Online (Sandbox Code Playgroud)

一切都运行正常,但如果我想添加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
Run Code Online (Sandbox Code Playgroud)

如何让matplotlib使用gi.repository?

谢谢

小智 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
Run Code Online (Sandbox Code Playgroud)

我不得不改变backend_gtk3agg.py第6行,它说:

import backend_agg
Run Code Online (Sandbox Code Playgroud)

from matplotlib.backends import backend_agg
Run Code Online (Sandbox Code Playgroud)

,所以它可以从我的安装中导入模块.到目前为止它对我有用,但我知道这个解决方案不适用于不同版本的matplotlib.


pto*_*ato 6

这是一个非常好的问题.我担心答案可能是"你做不到".Matplotlib的GTK后端是为PyGTK编写的,这是GTK的旧式Python绑定.gi.repository包是新式的Python绑定.我不知道他们是否可以混合,但你的结果似乎表明他们不能.

  • 11个月前,使用更新的gi.repository导入的GTK3后端在github中合并:https://github.com/matplotlib/matplotlib/pull/590我不确定这个版本是什么版本或者如何调用它,但是它应该*兼容......不幸的是,正如我最近发现的那样,你不能在同一个应用程序中使用这两个导入,它会崩溃(分段错误). (2认同)