L'interfaccia _PyGObject_API
è stata modificata a un certo punto. Avevo bisogno di abbandonare la funzione register_sinkfunc
. Le seguenti opere:
from gi.repository import Gio, GLib
import gi
import ctypes
class _PyGObject_Functions(ctypes.Structure):
_fields_ = [
('register_class',
ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p,
ctypes.c_int, ctypes.py_object,
ctypes.py_object)),
('register_wrapper',
ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.py_object)),
('lookup_class',
ctypes.PYFUNCTYPE(ctypes.py_object, ctypes.c_int)),
('newgobj',
ctypes.PYFUNCTYPE(ctypes.py_object, ctypes.c_void_p)),
]
class PyGObjectCPAI(object):
def __init__(self):
PyCObject_AsVoidPtr = ctypes.pythonapi.PyCObject_AsVoidPtr
PyCObject_AsVoidPtr.restype = ctypes.c_void_p
PyCObject_AsVoidPtr.argtypes = [ctypes.py_object]
addr = PyCObject_AsVoidPtr(ctypes.py_object(
gi._gobject._PyGObject_API))
self._api = _PyGObject_Functions.from_address(addr)
def pygobject_new(self, addr):
return self._api.newgobj(addr)
capi = PyGObjectCPAI()
per ottenere un oggetto da un puntatore:
obj = capi.pygobject_new(pointer)
per ottenere un puntatore da un (g) oggetto:
pointer = hash(obj)
devo aggiungere, in Nel mio caso questo non mi ha aiutato a risolvere il mio problema reale. Stavo cercando di interfacciare con dconf, ma dconf restituisce i valori di tipo GVariant, che non eredita da GObject. Sembra che PyGI/GObject sfortunatamente non esponga le funzioni necessarie per trasformare un C (* GVariant) in un Python GLib.Variant. Immagino sia di quelle volte in cui devi buttare via il tuo approccio iniziale e provare qualcosa di diverso.
In teoria è vero. Tuttavia volevo usare una funzione da libdconf, e al momento non esiste alcun collegamento per questo sul mio sistema operativo (Ubuntu Oneric). Inoltre, è pensabile che si debba gestire una libreria personalizzata (non parte di Gtk & co.) Che restituisca un puntatore a un oggetto GObject, quindi in casi di nicchia potrebbe comunque essere utile. – jdm
@jdm Vedo, grazie per il vostro feedback. – jcollado