2

id整数としてのみ指定されたObjective-CオブジェクトのPyObjCプロキシオブジェクトを取得する方法はありますか?拡張モジュールなしで実行できますか?

私の場合、wx.Frame.GetHandle(CocoaでwxMacを使用して)の戻り値からCocoaプロキシオブジェクトを取得しようとしています。

4

2 に答える 2

2

私が見つけた1つの解決策は、 :からオブジェクトctypesを作成することに依存しています。objc_objectid

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関数や、それを行うためのその他のすっきりとした方法があれば、きっと興味があるでしょう。

于 2012-09-08T04:57:27.433 に答える
1

PyObjC 2.5 では、これを使用できます。

import objc
objc.objc_object(ctypes_void_p=some_object_id)

以前のバージョンの PyObjC では、これを行うためのパブリック API はありません。

于 2013-02-22T13:58:23.200 に答える