首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为python安装cairo和rsvg

如何为python安装cairo和rsvg
EN

Stack Overflow用户
提问于 2019-05-14 18:42:45
回答 1查看 5K关注 0票数 2

我知道Stackoverflow是为了在代码方面提供帮助,但我想无论如何我还是会问的。

我从post 这里中发现,可以将.svg文件放在tkinter窗口中,但是经过几天的搜索,仍然找不到可以从.安装cairo和rsvg的地方。

我目前正在使用Windows 10和python 3.6。

编辑: 我已经知道了如何安装cairo和rsvg。开罗正在发挥作用,但rsvg没有发挥作用。不过,我已经设法将rsvg与cairo放在Tkinter中,而不是rsvg。对于任何对此感到好奇的人,您可能需要查看post:将.SVG图像放入平移框中

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-05-14 18:59:29

编辑:好的,所以pip不适用于安装pycairo。发现了这个。其他的选择对我也没有用。我要离开我的电脑了,但我会给你一些我发现的东西。 抱歉我帮不上忙了。希望你能弄明白!

首先,使用pip install pycairo

不幸的是,rsvg不能用于窗口,但是cairographics.org有一个简单的包装器。

将以下内容保存为与脚本相同的文件夹中的rsvg.py:

代码语言:javascript
复制
#some code to give rsvg.render_cairo(ctx) ability
#on windows.
import os
try:
    import rsvg
    WINDOWS=False
except ImportError:
    print"Warning, could not import 'rsvg'"
    if os.name == 'nt':
        print "Detected windows, creating rsvg."
        #some workarounds for windows

        from ctypes import *

        l=CDLL('librsvg-2-2.dll')
        g=CDLL('libgobject-2.0-0.dll')
        g.g_type_init()

        class rsvgHandle():
            class RsvgDimensionData(Structure):
                _fields_ = [("width", c_int),
                            ("height", c_int),
                            ("em",c_double),
                            ("ex",c_double)]

            class PycairoContext(Structure):
                _fields_ = [("PyObject_HEAD", c_byte * object.__basicsize__),
                            ("ctx", c_void_p),
                            ("base", c_void_p)]

            def __init__(self, path):
                self.path = path
                error = ''
                self.handle = l.rsvg_handle_new_from_file(self.path,error)


            def get_dimension_data(self):
                svgDim = self.RsvgDimensionData()
                l.rsvg_handle_get_dimensions(self.handle,byref(svgDim))
                return (svgDim.width,svgDim.height)

            def render_cairo(self, ctx):
                ctx.save()
                z = self.PycairoContext.from_address(id(ctx))
                l.rsvg_handle_render_cairo(self.handle, z.ctx)
                ctx.restore()



        class rsvgClass():
            def Handle(self,file):
                return rsvgHandle(file)

在脚本中,执行from rsvg import *,当需要使用它时,运行:

代码语言:javascript
复制
rC = rsvgClass()
h = rC.Handle("YOUR-FILE-HERE.svg")
s = cairo.ImageSurface(cairo.FORMAT_ARGB32, 100, 100)
ctx = cairo.Context(s)
h.render_cairo(ctx)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56136664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档