Как установить cairo и rsvg для python - PullRequest
0 голосов
/ 14 мая 2019

Я понимаю, что Stackoverflow предназначен для помощи с кодом, но я решил спросить в любом случае.

Я обнаружил из сообщения здесь , что можно поместить файл .svg в окно tkinter, но после нескольких дней поиска я все еще не могу найти ни одного местагде я мог бы установить cairo и rsvg из.

В настоящее время я использую Windows 10 с Python 3.6.

Заранее спасибо.

1 Ответ

2 голосов
/ 14 мая 2019

Редактировать: Хорошо, так что pip не будет работать для установки pycairo. Обнаружил это. И другие варианты не сработали для меня тоже. Я собираюсь быть подальше от компьютера, но я дам вам кое-что из того, что нашел.
Это Это и
Это

Извините, я не мог больше помочь. Надеюсь, вы поймете это!

Сначала используйте pip install pycairo

К сожалению, rsvg недоступен для Windows, но cairographics.org имеет простую оболочку.

Сохраните следующее как rsvg.py в той же папке, что и ваш скрипт:

#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 * и, когда вам нужно его использовать, запустите:

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)
...