有沒有一種方法可以獲得一個Objective-C對象的PyObjC代理對象,只給出其整數爲id
?它可以在沒有擴展模塊的情況下完成嗎?從整數ID獲取pyobjc對象
在我的情況下,我試圖從wx.Frame.GetHandle
(使用wxMac和Cocoa)的返回值中得到一個Cocoa代理對象。
有沒有一種方法可以獲得一個Objective-C對象的PyObjC代理對象,只給出其整數爲id
?它可以在沒有擴展模塊的情況下完成嗎?從整數ID獲取pyobjc對象
在我的情況下,我試圖從wx.Frame.GetHandle
(使用wxMac和Cocoa)的返回值中得到一個Cocoa代理對象。
的一個解決方案,我沒有找到依靠從id
創建一個objc_object
對象:
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()
這是一個有點討厭因爲它使用。如果我忽略了一個pyobjc
API函數或者其他一些較乾淨的方法,我肯定會對它感興趣。
在PyObjC 2.5,你可以這樣做:
import objc
objc.objc_object(ctypes_void_p=some_object_id)
沒有爲早期版本PyObjC的這樣做沒有公共API。
哎呀。這應該可以工作,但這是非常脆弱的:未來版本的PyObjC可能在_objc擴展中沒有「PyObjCObject_New」函數。 –