Как получить доступ к узлам svg и отредактировать их с помощью PySide?

#python #svg #pyside

#python #svg #pyside

Вопрос:

Я использую PySide для загрузки изображения svg в графический интерфейс Qt. SVG, созданный с помощью inkscape, состоит из слоев и элементов ( rect , circle , path , g групп …).

Это код, который я использую:

 from PySide import QtSvg                                                                                                                                                                                                                                                             
from PySide.QtCore import QLocale                                                                                                                                                                                                                                                    
from PySide.QtGui import *                                                                                                                                                                                                                                                           

if __name__ == "__main__":                                                                                                                                                                                                                                                           
    import sys                                                                                                                                                                                                                                                                       

    app = QApplication(sys.argv)                                                                                                                                                                                                                                                     
    svgWidget = QtSvg.QSvgWidget('file.svg')                                                                                                                                                                                                                             
    svgWidget.show()                                                                                                                                                                                                                                                                 

    sys.exit(app.exec_())       
  

Можно ли после импорта получить доступ и отредактировать / модифицировать определенный узел или элемент, например, изменить путь или изменить цвет прямоугольника?

Ответ №1:

Поскольку SVG — это XML-файл, вы можете открыть его с помощью QDomDocument и отредактировать.

Пример изменения цвета первого пути:

 if __name__ == "__main__":
    doc = QDomDocument("doc")

    file = QFile("image.svg")
    if not file.open(QIODevice.ReadOnly):
        print("Cannot open the file")
        exit(-1)

    if not doc.setContent(file):
        print("Cannot parse the content");
        file.close()
        exit(-1)
    file.close()

    roots = doc.elementsByTagName("svg")
    if roots.size() < 1:
       print("Cannot find root")
       exit(-1)

    # Change the color of the first path
    root = roots.at(0).toElement()
    path = root.firstChild().toElement()
    path.setAttribute("fill", "#FF0000")

    app = QApplication(sys.argv)                                                                                                                                                                                                                                                     
    svgWidget = QtSvg.QSvgWidget()
    svgWidget.load(doc.toByteArray())
    svgWidget.show()                                                                                                                                                                                                                                                                 

    sys.exit(app.exec_()) 
  

Комментарии:

1. Спасибо, это работает отлично. Теперь мне «просто» нужно научиться обходить DOM и находить элементы, как я привык делать с другими языками.