I'm going to make a wild ass guess here. Have you tried inserting
the macros to block threads? Can't remember exactly what they are
but I've seen tons of examples in the pygtk code.
Mathew
>
> I'm encountering some strange behavior and hope someone on this list
> can provide some insight. We're using pygtk 0.6.8 with python 2.1,
> and gtk-canvas 0.1. We're using the gtk-canvas instead of
> gnome-canvas so that our users don't have to install all of gnome. A
> disadvantage of that is that we have to create our own python wrappers
> for the canvas functions. Everything was fine until I tried to
> extract mouse click coordinates.
>
> Here's what happens. There's a C++ class, OOFCanvas, that wraps the
> gtk-canvas. It has a set_callback() function which looks like this:
>
> void OOFCanvas::set_callback(PyObject *callback) {
> pycallback = callback; // pycallback is OOFCanvas instance data
> Py_XINCREF(callback);
> gtk_signal_connect(GTK_OBJECT(root), // root is the gtk_canvas_root
> "event",
> GTK_SIGNAL_FUNC(OOFCanvas::mouse_event),
> this);
> }
>
> set_callback() is SWIGged, and I know that its argument is being
> handled correctly, since I can call the callback under other
> circumstances. (The SWIG typemap uses PyCallable_Check to verify that
> the argument is sane.)
>
> When the canvas gets an event, it calls the static function
> OOFCanvas::mouse_event, which just calls a non-static function:
>
> gint OOFCanvas::mouse_event(GtkCanvasItem *item, GdkEvent *event, gpointer data)
> {
> OOFCanvas *oofcanvas = (OOFCanvas*)(data);
> oofcanvas->mouse_eventCB(item, event);
> return TRUE;
> }
>
> That non-static function invokes the Python callback:
>
> void OOFCanvas::mouse_eventCB(GtkCanvasItem *item, GdkEvent *event) {
> PyObject *args = 0;
> switch(event->type) {
> case GDK_MOTION_NOTIFY:
> args = Py_BuildValue("(sdd)", "motion_notify",
> event->motion.x, event->motion.y);
> break;
> // [ several other event types omitted ]
> }
> if(args) {
> PyObject *result = PyEval_CallObject(pycallback, args); // dumps core!
> Py_XDECREF(args);
> Py_XDECREF(result);
> }
> }
>
> The call to PyEval_CallObject() dumps core. I know that the argument
> is being constructed correctly, since I can print it with
> PyString_AsString(PyObject_Repr(args)). I know that the callback is
> set correctly, since I can examine it in the same way. I can even
> call the callback function successfully (but not usefully) if I call
> it from set_callback(). It just doesn't work when I call it from
> within a GtkCanvasItem signal callback!
>
> Is there something special that I have to do to when calling Python
> from C within a C gtk signal callback? I can call the same Python
> function successfully, with the same C++ code, as long as I don't call
> it from within the signal handler.
>
> Any advice would be much appreciated.
>
> -- Steve
>
>
>
>
> --
> /* EMail: [EMAIL PROTECTED] ------------------ Phone: (301) 975-5423 --
> -- WWW: http://math.nist.gov/~SLanger/ ------------ Fax: (301) 990-4127 --
> -- Mail: NIST; 100 Bureau Drive -- Stop 8910; Gaithersburg, MD 20899-8910 */
> _______________________________________________
> pygtk mailing list [EMAIL PROTECTED]
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
_______________________________________________
pygtk mailing list [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/