Выберите объект GdkPixbuf.Pixbuf в Python3 - PullRequest
1 голос
/ 19 мая 2019

Я хочу мариновать и откреплять GdkPixbuf.Pixbuf в Python3. Чтобы быть более точным, пакет multiprocessing Python3 должен это сделать, потому что я делю такие объекты между процессами через Queue.

Проблема в том, что объект меняется с

<GdkPixbuf.Pixbuf object at 0x7f8b9e9cfb88 (GdkPixbuf at 0x563b61725c60)>

до

<GdkPixbuf.Pixbuf object at 0x7f8b9e9eaea0 (uninitialized at 0x(nil))>

Это минимальный рабочий пример.

>>> import gi
>>> from gi.repository import GdkPixbuf
__main__:1: PyGIWarning: GdkPixbuf was imported without specifying a version first. Use gi.require_version('GdkPixbuf', '2.0') before import to ensure that the right version gets loaded.

>>> pf = GdkPixbuf.Pixbuf.new_from_file('_icon.png')
>>> pf
<GdkPixbuf.Pixbuf object at 0x7f8b9e9cfb88 (GdkPixbuf at 0x563b61725c60)>

>>> import pickle
>>> pickle.dump(pf, open('p', 'wb'))

>>> pb2 = pickle.load(open('p', 'rb'))
>>> pb2
<GdkPixbuf.Pixbuf object at 0x7f8b9e9eaea0 (uninitialized at 0x(nil))>

Я не вижу другого способа засолки. Значок должен быть загружен в отдельном процессе (на другом ядре ЦП, чем основной / первый процесс приложения), а затем должен быть перенесен в основной процесс. Это делается через Queue, который выбирает все данные.

1 Ответ

0 голосов
/ 22 мая 2019

Мое решение заключается в том, чтобы удерживать «значок» не как объект Pixbuf в памяти, а как необработанные байты, которые я считывал из файла.

После распаковки этих байтов я конвертировал их в Pixbuf.

>>> import gi
>>> from gi.repository import GdkPixbuf, Gio, GLib
__main__:1: PyGIWarning: GdkPixbuf was imported without specifying a version first. Use gi.require_version('GdkPixbuf', '2.0') before import to ensure that the right version gets loaded.
>>> with open('_icon.png', 'rb') as f:
...     icon_bytes = f.read()
... 
>>> 
>>> import pickle
>>> pickle.dump(icon_bytes, open('p', 'wb'))
>>> 
>>> pb = pickle.load(open('p', 'rb'))
>>> pb = GLib.Bytes(pb)
>>> pb = GdkPixbuf.Pixbuf.new_from_stream(Gio.MemoryInputStream.new_from_bytes(pb))
>>> pb
<GdkPixbuf.Pixbuf object at 0x7fc0858ac5e8 (GdkPixbuf at 0x55e0d8d08b60)>
...