我在跟踪本教程如何用Python编写国际象棋程序。
它使用python引擎。该引擎的函数显然返回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>
本教程制作了一个传递参考到木星笔记本,以及如何使用它们来显示SVG图像。我没有使用朱庇特笔记本的经验,尽管我从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窗口打开并没有显示任何内容,在终端中我看到了大量文本(很明显,SVG数据是在控制台中结束的,而不是在正在打开的Qt窗口中)。
我想我必须在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图像!那么我的案子和这个案子有什么区别呢?
问题:,所以我的问题是,在棋盘SVG数据的情况下,我做错了什么?QtSvg库生成的SVG数据与不兼容吗?
发布于 2020-04-26 11:23:57
我认为您对Python的脚本特性感到困惑。您可以说,您有在C++下进行Qt开发的经验。您会不会先在那里创建一个主窗口小部件,并将您的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()编辑
如果您要向MainWindow类添加一个paint函数,那就更好了。因为在将来,当你移动一块的时候,你会想要多次重画你的板图像。所以我会做这种事。
def paintEvent(self, event):
self.chessboardSvg = chess.svg.board(self.chessboard).encode("UTF-8")
self.widgetSvg.load(self.chessboardSvg) https://stackoverflow.com/questions/61439815
复制相似问题