在Fedora 24上的Python3中使用`cairo.Region`时出现分段错误

问题描述 投票:4回答:1

我正在尝试将输入形状应用于窗口,所以我可以有一个透明的框架,其中只有有趣的部分可以单击,等等。

我在PyGObject(Python 3)中使用Cairo图形。

[对象是一个常规的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的both]部分:

from gi.repository import Gtk, Gdk, cairo
import cairo

至此,我不确定是这是Python问题还是我自己的错误。我不确定即使使用cairo.Region也是一样适用,我正在讲的示例是:http://www.programcreek.com/python/example/81481/cairo.Region


编辑

在这一点上,我感到非常困惑。我一直在研究这个,这是我发现的内容:

PyGI和开罗似乎存在某种错误。

当我仅使用开罗的内省部分时:

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来绘制开罗上下文。但是,经过内省的程序包似乎甚至不包含用于在表面上绘制的te运算符。非常奇怪。

当我使用just

内省模块时:
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

我想您会发现,它们都是很新的,并且符合我上面链接的示例中所述的要求。

此外,请考虑countdown.py的第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导入)时,出现的错误使我首先发布了此问题。

我开始相信我在概念上有误,也许吗?

我正在尝试将输入形状应用于窗口,因此我可以有一个透明框架,其中只有有趣的部分可以单击,等等。我正在将Cairo图形与PyGObject(Python 3)一起使用。 ...

python python-3.x gtk pygobject pycairo
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.