有没有办法为一个Objective-C对象获取一个PyObjC代理对象,只给它id
一个整数?可以不用扩展模块来完成吗?
在我的例子中,我试图从wx.Frame.GetHandle
(使用 wxMac 和 Cocoa)的返回值中获取一个 Cocoa 代理对象。
我确实找到的一个解决方案依赖于从以下位置ctypes
创建一个objc_object
对象id
:
import ctypes, objc
_objc = ctypes.PyDLL(objc._objc.__file__)
# PyObject *PyObjCObject_New(id objc_object, int flags, int retain)
_objc.PyObjCObject_New.restype = ctypes.py_object
_objc.PyObjCObject_New.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_int]
def objc_object(id):
return _objc.PyObjCObject_New(id, 0, 1)
其用于打印 a 的示例wx.Frame
:
import wx
class Frame(wx.Frame):
def __init__(self, title):
wx.Frame.__init__(self, None, title=title, pos=(150,150), size=(350,200))
m_print = wx.Button(self, label="Print")
m_print.Bind(wx.EVT_BUTTON, self.OnPrint)
def OnPrint(self, event):
topobj = objc_object(top.GetHandle())
topobj.print_(None)
app = wx.App()
top = Frame(title="ObjC Test")
top.Show()
app.MainLoop()
由于它使用了ctypes
. 如果有一个pyobjc
我忽略的 API 函数或其他更简洁的方法,我肯定会感兴趣。
在 PyObjC 2.5 中,您可以使用:
import objc
objc.objc_object(ctypes_void_p=some_object_id)
在早期版本的 PyObjC 中没有用于执行此操作的公共 API。