Fak*_*hid 6 python gtk svg cairo
我想通过名称呈现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"));
Run Code Online (Sandbox Code Playgroud)
但请注意,它适用于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()
Run Code Online (Sandbox Code Playgroud)
当然,它不起作用.
我错过了什么?
用于渲染SVG的GTK库称为RSVG.它有python绑定,但是它们没有文档,并且它们没有包装你在C中通常用于此目的的函数rsvg_handle_get_pixbuf_sub()
和rsvg_handle_render_cairo_sub()
函数.这就是我必须要做的事情.您可以像Adam Crossland建议的那样提取XML节点.要渲染它,你必须做这样的事情:
import gtk
import rsvg
handle = rsvg.Handle()
handle.write(buffer=xml_data)
# xml_data is the XML string for the object you want
image = gtk.Image()
image.set_from_pixbuf(handle.get_pixbuf())
Run Code Online (Sandbox Code Playgroud)
那就是你想要它gtk.Image
,否则用pixbuf做其他事情.您还可以将其渲染到Cairo上下文,handle.render_cairo(cr)
其中cr
包含Cairo上下文.
编辑:
对不起,我一开始并没有仔细阅读python绑定.这些_sub()
函数是使用id=
参数实现的,因此您的程序可以归结为:
#!/usr/bin/env python
import gtk
import rsvg
window = gtk.Window()
window.set_title("Foo")
window.connect("destroy", gtk.main_quit)
window.show()
svg = rsvg.Handle(file='cards.svg')
pixbuf = svg.get_pixbuf(id='#3_diamond')
image = gtk.Image()
image.set_from_pixbuf(pixbuf)
image.show()
window.add(image)
gtk.main()
Run Code Online (Sandbox Code Playgroud)
我测试了它,它的工作原理.然而,窗口是整个SVG画布的大小,并被剪裁到屏幕大小(这就是为什么我渲染了3颗钻石而不是角落里的俱乐部的ace.)所以你仍然会有找到一些方法来裁剪你想要的卡片周围的pixbuf,但这不应该太难.
归档时间: |
|
查看次数: |
5715 次 |
最近记录: |