#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 Я не уверен, в какой версии это есть или как именно это вызвать, но это должно быть совместимо… К сожалению, как я недавно выяснил, вы не можете использовать оба импорта в одном приложении, это приведет к сбою (ошибка сегментации).