我一直在尝试使用rsvg和cairo在tkinter帧中插入SVG图像。我从here获得了rsvg包装器,并花了一些代码将其从另一个StackOverflow帖子插入到tkinter屏幕中。由于某些原因,我不断收到错误消息:
OSError: exception: access violation reading 0x0000000C
get_dimension_data函数似乎有问题。 下面是我的脚本:
#some code to give rsvg.render_cairo(ctx) ability
#on windows.
import os
try:
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)
rsvghandler = rsvgClass()
import tkinter as tk
t=tk.Tk()
sss=tk.Frame(t)
def svgPhotoImage(self,file_path_name):
from PIL import Image, ImageTk
import cairo
svg = rsvghandler.Handle(file=file_path_name)
width, height = svg.get_dimension_data()[:2]
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(width), int(height))
context = cairo.Context(surface)
svg.render_cairo(context)
tk_image=ImageTk.PhotoImage('RGBA')
image=Image.frombuffer('RGBA',(width,height),surface.get_data(),'raw','BGRA',0,1)
tk_image.paste(image)
return(tk_image)
tk_image=svgPhotoImage(sss, 'C:/Users/whoever/example.svg')
frame.configure(image=tk_image)
except Exception as exception:
print(exception)
我不知道如何解决此问题。任何帮助将不胜感激。