我想按名称渲染 svg 文件的一部分,但对于我的一生,我无法弄清楚如何做到这一点(使用 python + gtk)。
这是有问题的 svg 文件:http: //david.bellot.free.fr/svg-cards/files/SVG-cards-2.0.1.tar.gz(更新:此文件不再存在,但您可以跟踪它在http://svg-cards.sourceforge.net/下)
在他的网站上,大卫说:
您可以通过将文件渲染到像素图并手动剪切每张卡片或通过 DOM 接口使用卡片名称来绘制卡片。所有卡片都嵌入到一个 SVG 组中。
我不知道他所说的 DOM 接口是什么意思。我做了一些搜索,发现似乎适合我想要做的最好结果是:
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"));
但是请注意,它是针对 Qt 的,甚至不是用 python 编写的。
这是我到目前为止所拥有的:
#!/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()
当然,它不起作用。
我错过了什么?