Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在tkinter中打开SVG文件?_Python_Svg_Tkinter - Fatal编程技术网

Python 如何在tkinter中打开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

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

我认为没有办法做到这一点而不损失质量分辨率,但是如果svglib不够好,cairo可能可以做得更好。试试下面的代码。它的优点是,您实际上不需要将图像作为png文件,但由于PIL不处理svg,因此您必须将其转换为:

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解释器使用它