이름으로 svg 파일의 일부를 렌더링하고 싶지만 나에게있어서 (python + gtk를 사용하여) 그렇게하는 방법을 모르겠습니다. http://david.bellot.free.fr/svg-cards/files/SVG-cards-2.0.1.tar.gz : 여기 svg 파일의 * parts *를 어떻게 렌더링합니까?
문제의 SVG 파일의 ( 이 업데이트 :이 파일이 더 이상 존재하지 않는,하지만 당신은 http://svg-cards.sourceforge.net/에 그것을 추적 할 수) 자신의 사이트에, 데이비드는 말한다 :
파일을 픽스맵에 렌더링하고 은 각 카드를 수동으로 자르거나 은 DOM 인터페이스를 통해 카드 이름을 사용하여 카드를 그릴 수 있습니다. 모든 카드는 SVG 그룹 에 삽입됩니다.
DOM 인터페이스가 의미하는 바를 모르겠습니다. 좀 검색을 수행하고 최상의 결과 나는 그게 뭔지 내가 원하는 맞는 것 같다 발견은 Qt를위한 심지어 파이썬으로 작성되지
QSvgRenderer *renderer = new QSvgRenderer(QLatin1String("SvgCardDeck.svg"));
QGraphicsSvgItem *black = new QGraphicsSvgItem();
QGraphicsSvgItem *red = new QGraphicsSvgItem();
black->setSharedRenderer(renderer);
black->setElementId(QLatin1String("black_joker"));
red->setSharedRenderer(renderer);
red->setElementId(QLatin1String("red_joker"));
주의 사항 그러나 있음.
#!/usr/bin/env python
from __future__ import absolute_import
import cairo
import gtk
import rsvg
from xml import xpath
from xml.dom import minidom
window = gtk.Window()
window.set_title("Foo")
window.set_size_request(256, 256)
window.set_property("resizable", False)
window.set_position(gtk.WIN_POS_CENTER)
window.connect("destroy", gtk.main_quit)
window.show()
document = minidom.parse("cards.svg")
element = xpath.Evaluate("//*[@id='1_club']", document)[0]
xml = element.toxml()
svg = rsvg.Handle()
svg.write(xml)
pixbuf = svg.get_pixbuf()
image = gtk.Image()
image.set_from_pixbuf(pixbuf)
image.show()
window.add(image)
gtk.main()
그것은 물론 작동하지 않습니다
이것은 내가 지금까지있는 것입니다.
무엇이 누락 되었습니까?
나는 실제로이 방법을 시도해 보았고, 그것이 무엇을하고 있었는지를 알 수 없었다. (그러므로 나는 비슷한 결과를 얻을 수 있는지 다른 해결책을 시도했다.) 창 크기가 전체 SVG 캔버스의 크기 임에도 불구하고이 솔루션은 내 질문에 답합니다 (물론 다른 질문을 제기하는 동안). :) –
이것은 많은 도움이 유용했을 지 모르지만 매우 도움이되었습니다. SVG 이미지의 일부를 렌더링하려면 handle.render_cairo (cr = c, id = "# layer_5")를 사용할 수 있습니다. 여기서 "c"는 카이로 컨텍스트입니다. 나에게 분명하지 않은 부분은 ID의 시작 부분에 "#"이 필요하다는 것입니다. 내 SVG에는 'id = "layer_1"'와 같은 id가 있으며 render_cairo (cr = c, id = "# layer_1")로 개별 레이어를 렌더링 할 수 있습니다. – bodgesoc