我希望能够在tkinter中打开SVG文件。我现在使用的答案是将SVG转换为PNG,然后在tkinter中显示它,但是由于我想在不损失质量的情况下调整其大小,因此我需要一个更好的答案。
一些基本的svg支持将成为tk 8.7的一部分(https://core.tcl-lang.org/tips/doc/trunk/tip/507.md)。
但是要向tk 8.6添加svg支持,必须安装额外的软件包,如tksvg。因此,请首先按照此处的说明安装tksvg 。然后,您可以PhotoImage
从svg文件创建一个,但您需要在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
,但它有其他选项(其中只有一个可以指定,因为它们是指定图像尺寸的三种不同的方式):
scale
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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句