Подтвердить что ты не робот

Понимание gi.repository

У меня проблемы с пониманием 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 `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?

Спасибо

4b9b3361

Ответ 1

Это очень хороший вопрос. Я боюсь, что ответ может быть "вы не можете". Matplotlib GTK backend написан для PyGTK, старинного стиля Python для GTK. Пакет gi.repository - это привязки Python нового стиля. Я не знаю, так или иначе, могут ли они смешиваться или нет, но ваши результаты, похоже, указывают, что они не могут.

Ответ 2

Кажется, что поддержка Gtk3 была добавлена ​​в . Я предполагаю, что это займет некоторое время, пока оно не будет доступно в основных дистрибутивах.

Лучшим решением было бы загрузить и установить последнюю версию.

Как обходной способ избежать установки файлов в Ubuntu 11.10 у меня есть dowloaded 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, где он говорит:

import backend_agg

с

from matplotlib.backends import backend_agg

поэтому он может импортировать модуль из моей установки. Пока это работает для меня, но я понимаю, что это решение не может работать с разными версиями matplotlib.