【问题标题】:Problems with GTK's rSVG using python in windowsGTK 的 rSVG 在 windows 中使用 python 的问题
【发布时间】:2014-01-24 11:24:36
【问题描述】:

我有一个在 Linux 上运行良好的 python 脚本,可以使用 Cairo 和 GTK 操作 SVG 文件。 在 Linux 上,我包含了这个库:

#import rsvg

我可以走了。在 Windows 上,它有点复杂。我找到了这个页面:http://cairographics.org/cairo_rsvg_and_python_in_windows/ 这建议使用给定的代码连接到 Windows 上的 GTK dll。这似乎可行,但 glib 正在报告我无法处理的错误,具体来说:

GLib-WARNING **: GError 设置在先前 GError 或未初始化内存的顶部。 这表明某人的代码中存在错误。在设置错误之前,您必须确保错误为 NULL。 覆盖错误消息是:打开文件时出错:没有这样的文件或目录

运行此代码时:

svg_file_name = "c:/test.svg" #also tried "c:\\test.svg" and "file:///c:/test.svg"
handler = rsvg.Handle(svg_file_name)
dim     = handler.get_dimension_data()

我不确定它到底在说什么文件,因为我似乎无法从 glib 中获得任何错误细节。我已经尝试了有问题的 SVG 文件名的所有排列。我假设它在抱怨那个文件,但它可能是 GTK 内部的东西,我不知道。

我已经尝试连接到 glib 的 DLL 并运行 g_clear_error(0) 以清除错误消息所涉及的错误堆栈,但根据 glib 错误报告的文档 (https://developer.gnome.org/glib/2.37/glib-Error-Reporting.html#g-clear-error) 我需要一个句柄如果我要对它做任何事情,那么导致问题的代码中的错误对象 - 在 python 中,我不确定我是如何得到它的。

欢迎任何关于 GTK 错误报告和从 python 清除的提示。如果做不到这一点,如果有人可以建议一个替代的 SVG 渲染库,它适用于 windows 的 python,我将不胜感激。 我已经尝试过 CairoSVG,它可以在一定程度上工作,但无法渲染渐变,并且似乎不允许对 SVG 数据进行编程操作。

感谢您的宝贵时间

【问题讨论】:

  • 最后,我已经在虚拟机上安装了 Ubuntu——这不那么麻烦了。我仍然在再次找到 rsvg 模块时遇到了一些问题,所以如果其他任何人在让它工作时遇到问题,请从 debian 命令行尝试以下操作:'sudo apt-get install python-rsvg'

标签: python linux windows svg gtk


【解决方案1】:

为什么找不到文件我不知道,但是覆盖一个GError的问题就在这里:

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

rsvg_handle_new_from_file() 需要一个指向 GError 的指针。相反,它会得到一个空字符串,并且在需要使用它时会感到非常困惑……那是行不通的。你可以尝试自己创建一个 GError 类,有一个例子in this question。这并非完全无关紧要:如果这不是用于生产代码,您可以跳过这部分并尝试找出找不到文件的原因...

对于找不到文件的问题,可以尝试在文件在工作目录时只使用“test.svg”,以限制可能出现问题的范围。

【讨论】:

  • 感谢您的回答:如果不出意外,这是教我如何将 python 绑定到共享库。我试过在当前工作目录中只给它一个本地文件名 - 它在 Linux 中工作,在 Windows 上同样的错误。为了完整起见,我正在尝试使用您提供链接的代码构造 GError 结构,但我不确定我是否理解语法的细微差别 - 我似乎无法使用访问结构的成员变量点符号,所以我在那里遗漏了一些东西。
【解决方案2】:

我建议对 RSVG 使用 GObject Introspection 绑定。在 Ubuntu 上安装包 gir1.2-rsvg-(whatever)。然后用from gi.repository import Rsvg 导入模块。

这些绑定是自动生成的,您根本不必关心GError 结构;错误会自动转换成 Python 异常。

【讨论】:

    【解决方案3】:

    我设法让错误处理工作。如果有人感兴趣,这里是this 的修改版本,需要在 python 中获取可用的 GError 对象:

          class rsvgHandle():
                class _GError(Structure):
                    _fields_ = [("domain", c_uint32), 
                                ("code", c_int), 
                                ("message", c_char_p)]
    
                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):
                    #l.rsvg_handle_new_from_file.argtypes = [c_char_p, POINTER(POINTER(self._GError))]
    
                    self.path = path                
                    error = POINTER(self._GError)()
                    print("Path: " + self.path)
                    self.handle = l.rsvg_handle_new_from_file(self.path,byref(error))
                    if (error != 0):
                        gerr = error.contents
                        print("error:" + str(gerr.message) + " : " + self.path)
    
    
                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)
    
            rsvg = rsvgClass()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多