Quiero rendir partes de un archivo SVG por su nombre, pero para la vida de mí no puedo encontrar la manera de hacerlo (usando GTK + python).¿Cómo se renderiza partes * * de un archivo SVG?
Aquí está el archivo SVG en cuestión: http://david.bellot.free.fr/svg-cards/files/SVG-cards-2.0.1.tar.gz (Actualización: este archivo ya no existe, pero se puede seguir hacia abajo en http://svg-cards.sourceforge.net/)
En su sitio, David, dice:
puede dibujar una tarjeta, ya sea por haciendo que el archivo en un mapa de píxeles y recorte cada tarjeta de forma manual o mediante usando el nombre de la tarjeta a través de una interfaz DOM . Todas las tarjetas están integradas en un grupo SVG.
No sé a qué se refiere con una interfaz DOM. He hecho un poco de búsqueda y el mejor resultado me encontré con que parece encajar lo que yo quiero hacer es: Sin embargo
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"));
en cuenta que se trata de Qt y ni siquiera está escrito en Python.
Esto es lo que tengo hasta ahora:
#!/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()
no funciona, por supuesto.
¿Qué me estoy perdiendo?
De hecho, también intenté de esta manera y no pude entender por qué estaba haciendo lo que estaba haciendo (de ahí que trate de encontrar otras soluciones para ver si obtengo un resultado similar). A pesar de que el tamaño de la ventana es del tamaño de todo el lienzo SVG, esta solución responde a mi pregunta (mientras, por supuesto, plantea otra pregunta). :) –
Esto fue súper útil, aunque habría sido útil más ayuda. Para representar parte de una imagen SVG puedes usar handle.render_cairo (cr = c, id = "# layer_5") donde "c" es un contexto de cairo. La parte que no era del todo obvia para mí es que se requiere el "#" al comienzo de la identificación. Mi SVG tiene identificadores como 'id = "layer_1"' y puedo renderizar capas individuales con render_cairo (cr = c, id = "# layer_1") – bodgesoc