Понимание 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?
Спасибо
Ответы
Ответ 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.