Interfejs _PyGObject_API
zmienił się w pewnym momencie. Musiałem zrezygnować z funkcji register_sinkfunc
. Następujące prace:
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()
Aby uzyskać obiekt od wskaźnika:
obj = capi.pygobject_new(pointer)
aby uzyskać wskaźnik z (g) obiektu:
pointer = hash(obj)
muszę dodawać, w mój przypadek nie pomógł mi rozwiązać mojego prawdziwego problemu. Próbowałem interfejs z dconf, ale dconf zwraca wartości typu GVariant, który nie dziedziczy z GObject. Wygląda na to, że PyGI/GObject niestety nie ujawnia potrzebnych funkcji do zmiany C (* GVariant) w Python GLib.Variant. Sądzę, że to z tych czasów, kiedy trzeba odrzucić swoje początkowe podejście i spróbować czegoś innego.
Teoretycznie to prawda. Jednak chciałem użyć funkcji z libdconf i obecnie nie ma na to powiązania w moim systemie operacyjnym (Ubuntu Oneric). Możliwe jest również, że mamy do czynienia z niestandardową biblioteką (nie będącą częścią Gtk & co.), Która zwraca wskaźnik do GObject, więc w niszowych przypadkach może to być przydatne. – jdm
@jdm Rozumiem, dziękuję za twoją opinię. – jcollado