Pull to refresh

Запуск Chaco и Mayavi на PySide

Reading time4 min
Views1.7K
Ну вот и появился долгожданный релиз PySide. Некоторые хабравчане начнут им пользоваться в первый раз, некоторые уже имели с ним дело.

В своей работе приходится пользоваться кроссплатформенными визуализатором Mayavi и построителем графиков Chaco (кому интересно — читаем code.enthought.com/chaco и code.enthought.com/projects/mayavi). Моей задачей было встроить их фрэймы в свое приложение HPGL-GUI. Изначально я писал все на PyQt4 и в меня устраивало все, кроме одной вещи. Проблемой стала лицензия. PySide выпускается под LGPL v2.1, что как раз подходит под коммерческие нужды.

На помощь пришел PySide, который уже начали активно использовать в качестве бэкэнда к продуктам Enthought. Тут-то меня и ждали первые подводные камни.

Отсутствие документации как именно использовать PySide для встраивания.
Немного проблуждав по исходникам, выяснил, что достаточно указать переменную окружения 'QT_API' в значение 'pyside':

import os
os.environ['QT_API'] = 'pyside'

Несмотря на это работать приложение отказывалось. Полез править исходники. Изменений оказалось вроде бы и не так много, но отыскивать проблемы с нуля довольно противно и долго. Надеюсь дальнейшие инструкции помогут кому-то.


Первым делом нужно собрать пакеты из гита. Ставим себе PySide, git, subversion, setuptools, swig, numpy, scipy, vtk, wxpython. Для Windows также потребуется установить mingw (vtk и wxpython для Win советую взять отсюда для экономии времени www.lfd.uci.edu/~gohlke/pythonlibs ).
  • Скачиваем и кладем в папочку ETS, переходим в нее и клонируем репозитории:
    git clone git://github.com/enthought/traits.git Traits
    git clone git://github.com/enthought/traitsbackendqt.git TraitsBackendQt
    git clone git://github.com/enthought/traitsbackendwx.git TraitsBackendWX
    git clone git://github.com/enthought/traitsgui.git TraitsGUI
    git clone git://github.com/enthought/enable.git Enable
    git clone git://github.com/enthought/chaco.git Chaco
    git clone git://github.com/enthought/mayavi.git Mayavi
    git clone git://github.com/enthought/enthoughtbase.git EnthoughtBase
    git clone git://github.com/enthought/envisagecore.git EnvisageCore
    git clone git://github.com/enthought/envisageplugins.git EnvisagePlugins
    git clone git://github.com/enthought/etsdevtools.git ETSDevTools
    git clone git://github.com/enthought/blockcanvas.git BlockCanvas
    git clone git://github.com/enthought/graphcanvas.git GraphCanvas
    git clone git://github.com/enthought/codetools.git CodeTools
    git clone git://github.com/enthought/apptools.git AppTools
    git clone git://github.com/enthought/scimath.git SciMath
  • Запускаем сборку:
    python ets.py develop
  • Если сборка не удалась, то доустанавливаем нужные пакеты и перезапускаем скрипт
  • После удачной сборки переходим в каталог Mayavi/enthought/tvtk/pyface/ui/qt4/
    Открываем все файлы поочередно и изменяем импорт PyQt4 на PySide.
    При желании можно пользоваться конструкцией вида:
    import os
    qt_api = os.environ.get('QT_API''pyqt') 
    if qt_api == 'pyqt':
        from PyQt4 import QtGui, QtCore
    else:
        from PySide import QtGui, QtCore
  • В файле init.py из той же директории нужно закомментировать строки 26-30 с проверкой версии PyQt:
    #if QtCore.QT_VERSION < 0x040200:
    # raise RuntimeError, "Need Qt v4.2 or higher, but got v%s" % QtCore.QT_VERSION_STR
     
    #if QtCore.PYQT_VERSION < 0x040100:
    # raise RuntimeError, "Need PyQt v4.1 or higher, but got v%s" % QtCore.PYQT_VERSION_STR
  • правим файл TraitsBackendQt/enthought/traits/ui/qt4/ui_panel.py в строках 920-926 (функция __add_widget(...)):
    if row < 0:
        if isinstance(w, QtGui.QWidget):
            layout.addWidget(w)
        elif isinstance(w, QtGui.QLayout):
            layout.addLayout(w)
        else:
            layout.addWidget(w)
  • Для тех, кто хочет работать под Win нужно подправить файл Mayavi\enthought\tvtk\pyface\ui\qt4\QVTKRenderWindowInteractor.py

    Добавим в импорты:
    from ctypes import pythonapi, c_void_p, py_object
    pythonapi.PyCObject_AsVoidPtr.restype = c_void_p
    pythonapi.PyCObject_AsVoidPtr.argtypes = [ py_object ]

    и, пользуясь заменой текстового редактора, меняем str(int(self.winId())) на str(int(pythonapi.PyCObject_AsVoidPtr(self.winId())))


После всех этих манипуляций можно запустить пример.
Для Chaco: pastebin.ubuntu.com/575888
Для Mayavi: pastebin.ubuntu.com/575889

Скриншоты работающих виджетов:



P.S. Если кому-то интересно, могу написать статьи по возможностям и подводным камням Chaco и Mayavi.
Tags:
Hubs:
Total votes 27: ↑24 and ↓3+21
Comments18

Articles