OK, I finally found the answer ! I spent many hours so I think this
example can help someone else.

It'd be great if there was such documentation on pygtk.org.

Code example :

Python module (button.py) :
---------------
import gtk

def newButton(label=""):
    b = gtk.Button(label)
    b.connect("clicked", lambda w: gtk.main_quit())
    return b
---------------


C source (embed-pygtk) :
---------------
/* 

 gcc embed-pygtk.c -o embed-pygtk -I/usr/include/python2.3
 -I/usr/include/pygtk-2.0/ -L/usr/lib/python2.3/config/ -lpython2.3
 -lpthread -lutil `pkg-config --libs --cflags glib-2.0 gthread-2.0
 gtk+-2.0 pygtk-2.0`

*/

#include <Python.h>
#include <gtk/gtk.h>
#include <pygobject.h>
#include <pygtk/pygtk.h>

int main(int argc, char **argv)
{
        GtkWidget *w;
        GtkWidget *b;
        PyObject *pName, *pModule, *pDict, *pFunc;
        PyObject *pArgs;
        PyObject *pValue;

        gtk_init(&argc, &argv);
        Py_Initialize();
        init_pygtk();

        w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(w, 
                         "destroy",
                         G_CALLBACK(gtk_main_quit), 
                         NULL);

        pName = PyString_FromString("button");
        pModule = PyImport_Import(pName);
        Py_DECREF(pName);

        if (pModule == NULL)
                g_error("Bad !");

        pDict = PyModule_GetDict(pModule);
        pFunc = PyDict_GetItemString(pDict, "newButton");

        if (pFunc && PyCallable_Check(pFunc)) {
                /* Tuple in argument */
                pArgs = PyTuple_New(1);
                pValue = PyString_FromString("Hello, World !");
                PyTuple_SetItem(pArgs, 0, pValue);
 
                pValue = PyObject_CallObject(pFunc, pArgs);
                Py_DECREF(pArgs);

                b = g_object_ref(pygobject_get(pValue));
        } else {
                g_error("Bad 2 !");
        }
        gtk_container_add(GTK_CONTAINER(w), b);
        gtk_widget_show_all(w);

        gtk_main();

        Py_Finalize();

        return 0;
}

Bye

Stephane


_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to