我一直在尝试把图像从https://betacssjs.chesscomfiles.com/bundles/web/favicons/safari-pinned-tab.f387b3f2.svg到Tkinter帧。我从here的帖子中发现,在rsvg和cairo的帮助下是可能的。
我在Windows 10上使用Python 3.6。我从here获取rsvg,从here获取cairo,然后将文件夹解压缩到'C:\Users.\site_packages'文件夹。它们很好,但我不知道如何使用它们。我试着使用代码:
import tkinter as tk
main=tk.Tk()
frame=tk.Frame(main)
def svgPhotoImage(self,file_path_name):
from PIL import Image,ImageTk
import rsvg,cairo
svg = rsvg.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)
#context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
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=self.svgPhotoImage(filename)
frame.configure(image=tk_image)
和
#rsvg.py
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)
rsvg = rsvgClass()).
h = rsvg.Handle("box.svg")
s = cairo.ImageSurface(cairo.FORMAT_ARGB32, 100, 100)
ctx = cairo.Context(s)
h.render_cairo(ctx)
在尝试了这些脚本之后,我一直收到错误消息:
AttributeError: module 'rsvg' has no attribute 'Handle'
我确信我在这个过程中做错了什么,但经过几个小时的搜索仍然不能想出如何让它工作。我还尝试安装Pycairo(通过PIP),但得到了错误消息
ERROR: Command "'c:\...\python36-32\python.exe' -u -c 'import setuptools, tokenize;__file__='"'"'C:\\...\\pip-install-peqhj3x1\\pycairo\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\...\Temp\pip-record-jfozfbuc\install-record.txt' --single-version-externally-managed --compile" failed with error code 1 in C:\...\pip-install-peqhj3x1\pycairo\
我不知道现在该怎么办
编辑:我终于能够从https://www.lfd.uci.edu/~gohlke/pythonlibs/获得pycairo,现在它可以工作了。我终于得到了rsvg不给给予我的错误消息以上参考here和得到必要的DLL文件从here。**Cairo工作正常,但RSVG正在创建一个空白屏幕。**我尝试了另一个7行here,并得到一个空白文件的输出,而不是转换后的文件。显然RSVG是不工作,我认为这是一个安装问题(如。不正确的.dll)。帮忙吗?
如果我尝试使用cairo和rsvg,因为它们占用的空间很小,而且速度很快; wand或其他库不是一个选择。我只是想能够把一个SVG文件到一个tkinter框架。如果有人知道如何正确安装rsvg,我会很感激知道。
任何帮助都将不胜感激。谢谢你的任何建议。
4条答案
按热度按时间lvjbypge1#
我使用svglib实现了这一点:
ruoxqz4g2#
我终于成功地在Windows上用Python 3和PyCairo转换SVG,但没有rsvg。Rsvg仍然不会合作,但显然仍然可以在没有它的情况下加载SVG。
安装过程并不是很简单,但嘿,它的工作!
说明:
请注意,这些说明是特定于Windows的。在Linux上,可以简单地通过pip安装pycairo并使用PyGObject的rsvg。
1.从https://www.lfd.uci.edu/~gohlke/pythonlibs/下载用于Windows安装的pycairo .whl文件。
1.通过pip安装下载的文件:
pip install /path/to/your/pycairo/whl.whl
如果这不起作用,请尝试使用上述链接中的其他文件。可能需要几次尝试。1.运行
pip install tinycss cssselect2 defusedxml
。这将为下一步安装依赖项。1.转到https://github.com/Kozea/CairoSVG。下载
cairosvg
文件夹并将其解压缩到站点包文件夹,使代码能够导入它。1.转到
cairosvg
文件夹并打开文件surface.py
。1.查找显示
import cairocffi as cairo
的行,并将其替换为import cairo
这应该足以在没有C++编译器的情况下在Windows上使用PyCairo。不幸的是,这仍然没有解决rsvg的问题(相反,它取代了rsvg),但至少它工作。
以下是一些如何使用它的例子:
将SVG转换为PNG:
将SVG放入Tkinter窗口而不下载输出:
因为它仍然使用Cairo,所以这个解决方案非常快,并且几乎没有依赖性。
希望这个答案对将来阅读这篇文章的人有用!
b1zrtrql3#
下面是另一种方法:
免责声明:我为库编写了绑定,这里是github链接:pylunasvg并链接到用c++编写的原始库:lunasvg
r9f1avp54#
感谢j_4321在此提供的答案https://stackoverflow.com/a/64829808/870802
我只是在这里发出一个稍微不同的光,以防它对任何人都有帮助。
据我所知,tksvg是在tkinter 8.6中可视化SVG图形的最简单和最简单的方法。我可以在IDLE中做到以下几点:
最终结果是:
如果您将SVG源代码保存在手边,那么您总是可以通过生成一个新的图像来调整图像的大小。
版本:Windows 7x64,Python 3.8.10,tkinter 8.6.9.0,tksvg 0.7.4