id
整数としてのみ指定されたObjective-CオブジェクトのPyObjCプロキシオブジェクトを取得する方法はありますか?拡張モジュールなしで実行できますか?
私の場合、wx.Frame.GetHandle
(CocoaでwxMacを使用して)の戻り値からCocoaプロキシオブジェクトを取得しようとしています。
私が見つけた1つの解決策は、 :からオブジェクト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関数や、それを行うためのその他のすっきりとした方法があれば、きっと興味があるでしょう。
PyObjC 2.5 では、これを使用できます。
import objc
objc.objc_object(ctypes_void_p=some_object_id)
以前のバージョンの PyObjC では、これを行うためのパブリック API はありません。