Как отобразить изображение SVG в Python - PullRequest
0 голосов
/ 26 апреля 2020

Я следовал этому уроку о том, как написать шахматную программу на Python.

. Он использует python -chess . Функции этого движка, очевидно, возвращают данные 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 и способы их использования для отображения изображений SVG. У меня нет опыта работы с Jupyter Notebooks, и, хотя я установил пакет из pip, и немного подумал о том, как его использовать, я не смог добиться большого прогресса в отношении моей первоначальной проблемы с шахматной доской. Но у меня есть опыт разработки Qt с использованием C ++, и, поскольку 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?).

Я решил установить библиотеку SVG под python, поэтому я установил drawSvg из pip. Но, похоже, библиотека генерирует изображения 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 на шахматной доске? Данные SVG, сгенерированные библиотекой python -chess, не совместимы с QtSvg?

1 Ответ

2 голосов
/ 26 апреля 2020

Я думаю, вы сбиты с толку сценарием Python. Вы говорите, у вас есть опыт разработки Qt под C ++. Не хотите ли вы сначала создать там виджет главного окна и добавить к нему свой 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) 
...