C++ kütüphanesine bir cython tabanlı arabirim uygularım. Normal işlevlerle çalışan bir geri çağırma sistemi uyguladım, ancak bağlı yöntemleri geçerken garip bir şekilde başarısız oluyor. Bu kod başlangıçta çalıştırıldığındaCython geri arama işlevi için düzgün çalışıyor, ancak bağlı yöntem için değil
class RenderCanvas(GLCanvas):
def __init__(self, parent):
self.scene = cybraincase.pyScene()
self.scene.setDrillButtonCallback(self.OnDrillButtonPress)
def OnDrillButtonPress(self, event):
print event
, bu basılır: <bound method RenderCanvas.OnDrillButtonPress of <UI.RenderCanvas; proxy of <Swig Object of type 'wxGLCanvas *' at 0x42b70a8> >>
cdef extern from "VolumeHapticTool.h":
cdef cppclass HDButtonEvent:
bool isPressed()
unsigned int getButtonId()
Vec3[float] getPosition()
ctypedef void (*HDButtonCallback)(HDButtonEvent, void *)
cdef extern from "Scene.h":
cdef cppclass Scene:
Scene()
void setDrillButtonCallback(HDButtonCallback, void*)
cdef void pyHDButtonCallback(HDButtonEvent e, void *user_data):
print <object>user_data
(<object>user_data)((e.isPressed(), e.getButtonId(), topy_vec3f(e.getPosition())))
cdef class pyScene:
cdef Scene * m_scene
def __init__(self):
self.m_scene = new Scene()
def __del__(self):
del self.m_scene
def setDrillButtonCallback(self, func):
print func
self.m_scene.setDrillButtonCallback(pyHDButtonCallback, <void*>func)
Ve burada: İşte benim Cython kodunun bir bölümüdür
Doğru görünüyor. Geri arama tetiklendiğinde sorun şu şekilde yazdırılır: <bound method Shell.readline of <wx.py.shell.Shell; proxy of <Swig Object of type 'wxStyledTextCtrl *' at 0x3a12348> >>
Tamamen farklı bir sınırlama yöntemi çağrılmaktadır. Ancak, OnDrillButtonPress
statik bir yöntem yaparken, <function OnDrillButtonPress at 0x042FC570>
hem başlatmaya hem de çağrıları tetiklemeye yazdırılır.
Sınırlama yöntemlerini void * olarak kaydetmeyle bir uyumsuzluk var mı?