Собственно сабж , такой экспешен райситься после таких вещей:
виджету подменяется метод contextMenuEvent на следующую функцию:
def create_context_menu(self,menu):
return lambda event : menu.exec_(event.globalPos())
widget.contextMenuEvent=create_context_menu(cmWrapper([{'action_title':action_handler}]))
Что делает этот код? В он заменяет ивен вызова контекстного меню на кастомное меню, которое создается путем задания конфига (хэш в __init__ у cmWrapper).
Эксепшен прилетает после отработки хэндлера экшена. Код отрабатывается, приложение не крашиться. Просто хотелось бы понять, откуда эксепшен летит и почему.
Для чего это нужно - что бы не писать методы создания менюшек для каждого виджета, а использовать так - как показано.
все это добро прилетает вот отсюда (исходники последнего sip)
/*
* Report a Python member function with an unexpected return type.
*/
static void sip_api_bad_catcher_result(PyObject *method)
{
PyObject *mname;
/*
* This is part of the public API so we make no assumptions about the
* method object.
*/
if (!PyMethod_Check(method) ||
PyMethod_GET_FUNCTION(method) == NULL ||
!PyFunction_Check(PyMethod_GET_FUNCTION(method)) ||
PyMethod_GET_SELF(method) == NULL)
{
PyErr_Format(PyExc_TypeError,
"invalid argument to sipBadCatcherResult()");
return;
}
mname = ((PyFunctionObject *)PyMethod_GET_FUNCTION(method))->func_name;
#if PY_MAJOR_VERSION >= 3
PyErr_Format(PyExc_TypeError, "invalid result type from %s.%U()",
Py_TYPE(PyMethod_GET_SELF(method))->tp_name, mname);
#else
PyErr_Format(PyExc_TypeError, "invalid result type from %s.%s()",
Py_TYPE(PyMethod_GET_SELF(method))->tp_name,
PyString_AsString(mname));
#endif
}
мне кажется тут 2 пути решения -
1. Проверить - жива ли функция которая вернулась лямбдой после отработки хэндлера.
2 Собрать свежий SIP и PyQt и попробовать.
Больше у меня мыслей, пока, нет.