亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Python 中顯示 SVG 圖像

如何在 Python 中顯示 SVG 圖像

慕標5832272 2022-10-25 10:39:52
我正在關注如何用 Python 編寫國際象棋程序的本教程。它使用python-chess引擎。該引擎的函數顯然返回 SVG 數據,可用于顯示棋盤。教程中的代碼:import chessimport chess.svgfrom IPython.display import SVGboard = chess.Board()SVG(chess.svg.board(board=board,size=400))  但是當我運行該代碼時,我看到的只是終端中的一行,沒有圖像。<IPython.core.display.SVG object>本教程簡要介紹了Jupyter Notebooks 以及如何使用它們來顯示 SVG 圖像。我沒有使用 Jupyter Notebooks 的經驗,即使我從 pip 安裝了該軟件包,并且對如何使用它進行了一些嘗試,但對于我最初的棋盤問題,我并沒有取得太大進展。但我所擁有的是使用 C++ 進行 Qt 開發的經驗,并且由于 Qt 具有 Python 綁定,我決定使用這些綁定。這是我寫的:import sysimport chessimport chess.svgfrom PyQt5 import QtGui, QtSvgfrom PyQt5.QtWidgets import QApplicationfrom IPython.display import SVG, displayapp = 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 圖像。而且對我沒用。更奇怪的是,在看到這個 SO question之后,我嘗試了以下方法:import sysimport chessimport chess.svgfrom PyQt5 import QtGui, QtSvgfrom PyQt5.QtWidgets import QApplicationfrom IPython.display import SVG, displayapp = 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 數據的情況下我做錯了什么?python-chess庫生成的SVG數據是不是和QtSvg不兼容?
查看完整描述

1 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

我認為您對 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 類會更好。因為可以肯定的是,在將來,每當您移動棋子時,您都會想多次重繪棋盤圖像。所以我會做這樣的事情。


     def paintEvent(self, event):

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

         self.widgetSvg.load(self.chessboardSvg) 


查看完整回答
反對 回復 2022-10-25
  • 1 回答
  • 0 關注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號