如何在Tkinter中打开SVG文件?

二重奏

我希望能够在tkinter中打开SVG文件。我现在使用答案是将SVG转换为PNG,然后在tkinter中显示它,但是由于我想在不损失质量的情况下调整其大小,因此我需要一个更好的答案。

j_4321

一些基本的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在views.py中打开静态文件

来自分类Dev

如何在Tkinter中打开SVG文件?

来自分类Dev

如何在Android浏览器中打开pdf文件?

来自分类Dev

如何在QT中打开SVG文件(QGraphicsView)

来自分类Dev

Tkinter-如何打开最近的文件?

来自分类Dev

如何在perforce中还原所有打开的文件?

来自分类Dev

如何在Swift中打开文件?

来自分类Dev

如何在vim中从旧文件列表中打开文件?

来自分类Dev

如何在iOS中打开文件?

来自分类Dev

如何在Sudoku中打开文件?

来自分类Dev

巨大的.svg。如何在20.04中打开

来自分类Dev

如何在Python中打开MHTML文件?

来自分类Dev

如何在Eclipse中创建SVG文件

来自分类Dev

如何在C程序中打开文件?

来自分类Dev

如何在Excel中打开ODS文件?

来自分类Dev

如何在Windows中打开Lucene文件?

来自分类Dev

如何在Django中打开.txt文件?

来自分类Dev

如何在python 3中打开文件

来自分类Dev

如何在Ubuntu中打开Cookie的文件

来自分类Dev

如何在python中打开目录中的所有文件?

来自分类Dev

如何在inkscape的/ tmp文件夹中打开文件?

来自分类Dev

如何在Linux中打开文件

来自分类Dev

如何在python中打开Mat文件

来自分类Dev

如何在cytoscape中打开.cns文件

来自分类Dev

如何在Word中打开文件

来自分类Dev

如何在打开的文件中输入文件路径

来自分类Dev

在 Tkinter 中打开保存文件

来自分类Dev

如何在 Ubuntu 中打开 .movie 文件?

来自分类Dev

如何在php中打开linux文件?