Python 如何在tkinter中打开SVG文件?
我希望能够在tkinter中打开SVG文件。在tkinter中显示之前,我现在使用的将SVG转换为PNG,但是由于我想在不损失质量的情况下调整它的大小,我需要一个更好的答案。我认为没有办法做到这一点而不损失质量分辨率,但是如果svglib不够好,cairo可能可以做得更好。试试下面的代码。它的优点是,您实际上不需要将图像作为png文件,但由于PIL不处理svg,因此您必须将其转换为:Python 如何在tkinter中打开SVG文件?,python,svg,tkinter,Python,Svg,Tkinter,我希望能够在tkinter中打开SVG文件。在tkinter中显示之前,我现在使用的将SVG转换为PNG,但是由于我想在不损失质量的情况下调整它的大小,我需要一个更好的答案。我认为没有办法做到这一点而不损失质量分辨率,但是如果svglib不够好,cairo可能可以做得更好。试试下面的代码。它的优点是,您实际上不需要将图像作为png文件,但由于PIL不处理svg,因此您必须将其转换为: from io import BytesIO import cairosvg from PIL import I
from io import BytesIO
import cairosvg
from PIL import Image
out = BytesIO()
cairosvg.svg2png(url='path/to/svg', write_to=out)
image = Image.open(out)
一些基本的svg支持将成为tk 8.7()的一部分 但要将svg支持添加到tk 8.6中,有必要安装一个额外的包,如。因此,首先按照中的说明安装tksvg。然后,您可以从svg文件创建一个
PhotoImage
,但需要在tcl解释器中加载tksvg。我为tksvg编写了一个快速python包装器:
import tkinter as tk
class SvgImage(tk.PhotoImage):
"""Widget which can display images in PGM, PPM, GIF, PNG format."""
_tksvg_loaded = False
_svg_options = ['scale', 'scaletowidth', 'scaletoheight']
def __init__(self, name=None, cnf={}, master=None, **kw):
# load tksvg
if not SvgImage._tksvg_loaded:
if master is None:
master = tk._default_root
if not master:
raise RuntimeError('Too early to create image')
master.tk.eval('package require tksvg')
SvgImage._tksvg_loaded = True
# remove specific svg options from keywords
svgkw = {opt: kw.pop(opt, None) for opt in self._svg_options}
tk.PhotoImage.__init__(self, name, cnf, master, **kw)
# pass svg options
self.configure(**svgkw)
def configure(self, **kw):
svgkw = {opt: kw.pop(opt) for opt in self._svg_options if opt in kw}
# non svg options
if kw:
tk.PhotoImage.configure(self, **kw)
# svg options
options = ()
for k, v in svgkw.items():
if v is not None:
options = options + ('-'+k, str(v))
self.tk.eval('%s configure -format {svg %s}' % (self.name, ' '.join(options)))
因此SvgImage
类似于PhotoImage
,但它有额外的选项(只能指定其中一个选项,因为它们是指定图像大小的三种不同方式):
比例
:以像素为单位的宽度scaletowidth
:以像素为单位的高度scaletoheight
root = tk.Tk()
def rescale():
global scale
scale += 0.5
img.configure(scale=scale)
scale = 0.5
img = SvgImage(master=root, file='/path/to/file.svg', scale=scale)
tk.Button(root, image=img, command=rescale).pack()
root.mainloop()
你是说tkinter不能处理SVG?是的。它只处理特定的图像对象。您通常使用PIL创建此类对象,但PIL不通过“打开”来处理SVG您是说“显示”,还是像文本文件一样打开它来读取其内容?Tkinter无法处理SVG,因此如果您不想失去质量,每次调整原始SVG的大小时,您都需要再次转换它。@BryanOakley我的意思是显示。@j_4321 tkinter是否可以将任何可缩放的图形格式处理为可缩放的?但某些SVG支持将添加到Tk的下一个版本(8.7):,否则,您可以尝试使用该库,但需要通过tcl解释器使用它