如何在 Python 中显示 SVG 图像

How to display an SVG image in Python

我正在关注 this tutorial 如何在 Python 中编写国际象棋程序。

它使用 python-chess 引擎。该引擎的功能显然是 return SVG 数据,可用于显示棋盘。

import chess
import chess.svg

from IPython.display import SVG

board = chess.Board()
SVG(chess.svg.board(board=board,size=400))  

但是当我 运行 该代码时,我在终端中看到的只是一行,没有图像。

<IPython.core.display.SVG object>

本教程对 Jupyter Notebooks 进行了 passing reference 介绍,以及如何使用它们来显示 SVG 图像。我没有使用 Jupyter Notebooks 的经验,尽管我从 pip 安装了这个包,并且稍微了解了如何使用它,但我在解决我最初的棋盘问题方面并没有取得太大进展。但我确实拥有使用 C++ 进行 Qt 开发的经验,并且由于 Qt 具有 Python 绑定,我决定使用这些绑定。

这是我写的:

import sys
import chess
import chess.svg
from PyQt5 import QtGui, QtSvg
from PyQt5.QtWidgets import QApplication
from IPython.display import SVG, display

app = QApplication(sys.argv);

board = chess.Board(); 
svgWidget = QtSvg.QSvgWidget(chess.svg.board(board=board, size=400));
#svgWidget.setGeometry(50,50,759,668)
svgWidget.show()

sys.exit(app.exec_())

Qt window 打开但什么也没显示,在终端中我看到很多文本 - (显然 SVG 数据最终出现在控制台中,而不是 Qt window 中开?)。

我想我必须在 python 下安装一些 SVG 库,所以我从 pip 安装了 drawSvg。但似乎图书馆生成 SVG 图像。而且对我没用。

更奇怪的是,在看到之后,我尝试了以下:

import sys
import chess
import chess.svg
from PyQt5 import QtGui, QtSvg
from PyQt5.QtWidgets import QApplication
from IPython.display import SVG, display

app = QApplication(sys.argv);

board = chess.Board(); 
svgWidget = QtSvg.QSvgWidget('d:\projects\python_chess\Zeichen_123.svg');
#svgWidget.setGeometry(50,50,759,668)
svgWidget.show()

sys.exit(app.exec_())

它显示了一张图片 - 一张 SVG 图片!那我的case和这个case有什么区别呢?

问题: 所以我的问题是,在棋盘 SVG 数据的情况下我做错了什么? python-chess 库生成的 SVG 数据是否与 QtSvg 不兼容?

我认为您对 Python 的脚本性质感到困惑。你说,你有C++下的Qt开发经验。您不会先在那里创建一个主 window 小部件,然后向其中添加您将在其中调用或加载 SVG 数据的 SVG 小部件吗?

我会像这样重写你的代码。

import chess
import chess.svg

from PyQt5.QtSvg import QSvgWidget
from PyQt5.QtWidgets import QApplication, QWidget


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(100, 100, 1100, 1100)

        self.widgetSvg = QSvgWidget(parent=self)
        self.widgetSvg.setGeometry(10, 10, 1080, 1080)

        self.chessboard = chess.Board()

        self.chessboardSvg = chess.svg.board(self.chessboard).encode("UTF-8")
        self.widgetSvg.load(self.chessboardSvg)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

编辑

如果您能在主窗口中添加一个绘图功能就更好了class。因为将来肯定会想要多次重绘您的棋盘图像,每当您移动一个棋子时。所以我会做这样的事情。

     def paintEvent(self, event):
         self.chessboardSvg = chess.svg.board(self.chessboard).encode("UTF-8")
         self.widgetSvg.load(self.chessboardSvg)