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

#python #gtk #matplotlib

#python #gtk #matplotlib

Вопрос:

У меня проблемы с пониманием gi.repository

Я использую эту конструкцию в своем коде

 from gi.repository import Gtk
  

Но если я хочу использовать какой-то компонент, я получаю ошибку импорта

Я искал, и у меня получилось, что это сработало для некоторых компонентов, таких как GtkSource, Vte, GLib, …

Итак, мой код похож

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

Все работало нормально, но если я хочу добавить matplotlib для рисования на моем canvas, я получаю и ошибка

     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?

Спасибо

Ответ №1:

Похоже, что поддержка 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.

Комментарии:

1. Привет, ты хочешь сказать, что ты только что загрузил два файла? Я пытаюсь использовать этот пример: matplotlib.org/dev/examples/user_interfaces / … используя процедуру, которую вы объясняете, но она не работает. Не могли бы вы, пожалуйста, рассказать немного больше. Также вы используете Figure из локальной установки matplotlib или нет?

Ответ №2:

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

Комментарии:

1. 11 месяцев назад серверная часть GTK3 с более новым импортом gi.repository была объединена в github: github.com/matplotlib/matplotlib/pull/590 Я не уверен, в какой версии это есть или как именно это вызвать, но это должно быть совместимо… К сожалению, как я недавно выяснил, вы не можете использовать оба импорта в одном приложении, это приведет к сбою (ошибка сегментации).