有没有办法为Objective-C对象获取PyObjC代理对象,只给它id
作为整数?可以在没有扩展模块的情况下完成吗?
在我的情况下,我试图从wx.Frame.GetHandle
的返回值(使用带有Cocoa的wxMac)获取Cocoa代理对象。
答案 0 :(得分:2)
我找到的一个解决方案依赖于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)
用于打印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函数或其他一些更简洁的方法,我肯定会感兴趣。
答案 1 :(得分:1)
在PyObjC 2.5中你可以使用它:
import objc
objc.objc_object(ctypes_void_p=some_object_id)
在早期版本的PyObjC中没有公共API。