Я пытаюсь получить форму ввода для применения к окну, поэтому у меня может быть прозрачная рамка, в которой можно щелкнуть только интересные части и т. д.
Я использую графику Cairo с PyGObject (Python 3).
Объект — это обычный объект Gtk Windows, который затем определяет область рисования Cairo:
class Face(Gtk.Window):
def __init__(self):
super(Face, self).__init__()
self.init_ui()
def init_ui(self):
[...]
self.darea = Gtk.DrawingArea()
self.darea.connect("draw", self.on_draw)
self.add(self.darea)
def on_draw(self, widget, cr):
[... (drawing a couple shapes into the context)]
sface = cr.get_group_target()
mregion = Gdk.cairo_region_create_from_surface(sface)
# the above line produces the error
# the following lines is wishful thinking at this point...
#self.get_window().input_shape_combine_region(mregion, 0, 0)
Таким образом, функция on_draw()
вызывается всякий раз, когда необходимо перерисовать область рисования, то есть когда окно перемещается, изменяется его размер, открывается после того, как оно было скрыто, и так далее.
большая часть окна на самом деле пуста, поскольку предполагается, что это в основном полупрозрачная рамка, и только видимые части должны быть кликабельными. Однако я получаю следующую ошибку:
Traceback (most recent call last):
File "./lsc.py", line 236, in on_draw
mregion = Gdk.cairo_region_create_from_surface(sface)
TypeError: Couldn't find foreign struct converter for 'cairo.Region'
python3: cairo-surface.c:953: cairo_surface_destroy: Assertion `CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)' failed.
zsh: abort (core dumped) ./lsc.py
Пакеты для Python3, библиотеки PyGObject и Cairo установлены, и я также импортировал обе части Cairo:
from gi.repository import Gtk, Gdk, cairo
import cairo
На данный момент я не совсем уверен, является ли это проблемой Python или ошибкой с моей стороны. Я не уверен, применимо ли даже использование cairo.Region
, пример, который я привожу, таков: http://www.programcreek.com/python/example/81481/cairo.Регион
Редактировать
В этот момент я серьезно озадачен тем, что происходит. Я немного изучал это, и вот что я узнал:
Кажется, есть какая-то ошибка с PyGI и Cairo.
Когда я использую только часть самоанализа cairo:
from gi.repository import Gtk, Gdk, cairo
#import cairo
И затем запустите мой скрипт, я получаю эту ошибку:
raceback (most recent call last):
File "./lsc.py", line 164, in on_draw
cr.set_operator(cairo.OPERATOR_SOURCE)
File "/usr/lib64/python3.5/site-packages/gi/module.py", line 139, in __getattr__
self.__name__, name))
AttributeError: 'gi.repository.cairo' object has no attribute 'OPERATOR_SOURCE'
Очевидно, я использую cairo.OPERATOR_SOURCE
в своем коде, чтобы рисовать в контексте cairo. Однако интроспективный пакет, по-видимому, даже не содержит операторов, используемых для рисования на поверхности. Очень странный.
Когда я использую просто неинтроспективный модуль:
from gi.repository import Gtk, Gdk
import cairo
Я получаю ту же ошибку, что и в моей первой части вопроса.
для завершения это список пакетов cairo, которые я сейчас установил:
cairo-devel-1.14.6-1.fc24.x86_64
pycairo-devel-1.10.0-4.fc24.x86_64
cairo-gobject-1.14.6-1.fc24.i686
mingw32-cairo-1.14.6-1.fc24.noarch
python3-cairocffi-0.7.2-5.fc24.noarch
cairo-1.14.6-1.fc24.i686
cairo-1.14.6-1.fc24.x86_64
pycairo-1.10.0-4.fc24.x86_64
python3-cairosvg-1.0.19-3.fc24.noarch
cairomm-devel-1.12.0-2.fc24.x86_64
cairo-clock-0.3.4-17.fc24.x86_64
cairomm-1.12.0-2.fc24.x86_64
cairo-gobject-1.14.6-1.fc24.x86_64
python3-cairo-1.10.0-15.fc24.x86_64
mingw32-cairomm-1.12.0-2.fc24.noarch
python3-cairo-devel-1.10.0-15.fc24.x86_64
cairo-gobject-devel-1.14.6-1.fc24.x86_64
Я думаю, вы обнаружите, что все они появились совсем недавно и соответствуют требованиям, указанным в примере, который я привел выше.
Также обратите внимание на строки 268–274 документа countdown.py
:
# make window click-through, this needs pycairo 1.10.0 for python3
# to work
rect = cairo.RectangleInt (0, 0, 1, 1)
region = cairo.Region (rect)
if (not region.is_empty ()):
self.window.input_shape_combine_region (None)
self.window.input_shape_combine_region (region)
Автор не использует интроспективный cairo
, он просто делает import cairo
, что наводит меня на мысль, что это, возможно, более правильный способ.
В любом случае, весь сценарий тоже не работает.
В этот момент я снова застрял. Кажется, я не могу найти недавний и/или рабочий пример того, как использовать эту функциональность.
Пока кажется, что использование интроспективной версии cairo
бесполезно, в ней почти не определяются элементы оригинала. Однако при использовании обычного pycairo
(путем импорта с import cairo
) я получаю сообщение об ошибке, которое заставило меня опубликовать этот вопрос в первую очередь.
Я начинаю верить, что у меня концептуальная ошибка, может быть?
dnf install pycairo pycairo-devel
обычные репозитории Fedora и т. д. - person polemon   schedule 11.07.2016from gi.repository import cairo
совершенно бесполезен. Кроме того, я заметил это в документации cairo:[the surface] can be a "nil" surface if cr is already in an error state
, так что, возможно, стоит проверить, так ли это. - person Aran-Fey   schedule 16.07.2016