LINUX.ORG.RU

pygtk обьекты в c++


0

0

Возникла следующая проблема.
Буду рад любомо возможному варианту её решения.

Есть gui на python по некоторой обработке изображений.
Изображения содежжаться в GdkPixbuf обьекте. gtk.gdk.Pixbuf, но
обработка проходит очень медленно, так как изображение обрабатывается
как Numeric array. А хотелось бы из c++.

Написание модуля на c++ для python не составляет, труда. В случае если есть возможность получить ссылку на исходный GdkPixbuf.

Был опробован следующий способ:
Написан модуль с использованием pygtk на основе собственно кода pygtk.

>>>
#include <Python.h>

#define NO_IMPORT_PYGOBJECT

#include <pygobject.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>

static GdkPixbuf* _wrap_pixbuf_object_to_ptr( PyGObject *pixbuf ) {
	return GDK_PIXBUF( pixbuf->obj );    
}

PyMethodDef py_functions[] = {
    { "pixbuf_object_to_ptr", (PyCFunction)_wrap_pixbuf_object_to_ptr,
       METH_VARARGS },
    { NULL, NULL, 0 }
};

PyMODINIT_FUNC init_ptr_gen(void) {
    (void) Py_InitModule( "_ptr_gen", py_functions );
}

>>>>
После чего данный код после возврата значения в python тружно вместе с интерпретатором делает segmentation failed.

Заранее Благодарен.

Ответ на: комментарий от kosmonavt

Собственно враппер и нужен. 
Только не понятно как pygtk обьекты использовать из C.

Код на C должен делать собственно тоже самое что и на python только соответственно на порядок быстрее. 

В дополнение ко всему в классе GdkPixbuf есть метод (gchar*) get_pixels( ) которые возвращает ссылку данные изображения. Но по какой то причине в pygtk вместо того чтобы возвращать массив возвращается строка, с которой собственно ничего хорошего сделать нельзя. 

Haiodo
() автор топика
Ответ на: комментарий от Haiodo

Ну так swig в этом деле сильно упрощает жизнь. Без него вам придется постоянно держать в уме (и в собственном коде) счетчики ссылок на объекты. Сегфолт у вас мог быть потому, что не доучли число ссылок и питон удалил объект.

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.