首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中显示SVG图像

如何在Python中显示SVG图像
EN

Stack Overflow用户
提问于 2020-04-26 11:20:37
回答 1查看 10.7K关注 0票数 7

我在跟踪本教程如何用Python编写国际象棋程序。

它使用python引擎。该引擎的函数显然返回SVG数据,可以用来显示棋盘。

  • 本教程中的代码:
代码语言:javascript
复制
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>

本教程制作了一个传递参考到木星笔记本,以及如何使用它们来显示SVG图像。我没有使用朱庇特笔记本的经验,尽管我从pip安装了这个软件包,并且我尝试了一下如何使用它,但我对我原来的棋盘问题并没有取得多大的进展。但我所拥有的是使用C++进行Qt开发的经验,而且由于Qt有Python绑定,所以我决定使用这些绑定。

以下是我所写的:

代码语言:javascript
复制
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窗口打开并没有显示任何内容,在终端中我看到了大量文本(很明显,SVG数据是在控制台中结束的,而不是在正在打开的Qt窗口中)。

我想我必须在python下安装一些SVG库,所以我从pip中安装了drawSvg。但是似乎库会生成SVG图像。对我来说也没用。

更奇怪的是,在看到这个问题之后,我尝试了以下方法:

代码语言:javascript
复制
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图像!那么我的案子和这个案子有什么区别呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-26 11:23:57

我认为您对Python的脚本特性感到困惑。您可以说,您有在C++下进行Qt开发的经验。您会不会先在那里创建一个主窗口小部件,并将您的SVG小部件添加到其中,在其中调用或加载SVG数据?

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

代码语言:javascript
复制
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()

编辑

如果您要向MainWindow类添加一个paint函数,那就更好了。因为在将来,当你移动一块的时候,你会想要多次重画你的板图像。所以我会做这种事。

代码语言:javascript
复制
     def paintEvent(self, event):
         self.chessboardSvg = chess.svg.board(self.chessboard).encode("UTF-8")
         self.widgetSvg.load(self.chessboardSvg) 
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61439815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档