如何在 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)
我正在关注 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)