Tôi muốn hiển thị các phần của tệp svg theo tên nhưng đối với cuộc sống của tôi, tôi không thể tìm ra cách làm như vậy (sử dụng python + gtk).Làm cách nào để hiển thị * các phần * của tệp svg?
Dưới đây là file svg trong câu hỏi: http://david.bellot.free.fr/svg-cards/files/SVG-cards-2.0.1.tar.gz (Cập nhật: tập tin này không còn tồn tại, nhưng bạn có thể theo dõi nó xuống http://svg-cards.sourceforge.net/)
Trên trang web của mình, David, nói:
Bạn có thể vẽ thẻ bằng cách hiển thị tệp trên bản đồ pixmap và cắt từng thẻ theo cách thủ công hoặc bằng cách sử dụng tên của thẻ thông qua giao diện DOM . Tất cả các thẻ được nhúng vào một nhóm SVG.
Tôi không biết ý của anh ấy là giao diện DOM. Tôi đã thực hiện một số tìm kiếm và kết quả tốt nhất mà tôi thấy rằng dường như phù hợp với những gì tôi muốn làm là:
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"));
Tuy nhiên, thông báo rằng đó là cho Qt và thậm chí không được viết bằng python.
Đây là những gì tôi có cho đến nay:
#!/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()
Nó không làm việc, tất nhiên.
Tôi đang thiếu gì?
Tôi thực sự đã thử cách này quá và không thể tìm ra lý do tại sao nó đã làm những gì nó đã làm (do đó tôi cố gắng giải pháp khác để xem nếu tôi muốn có được một kết quả tương tự). Mặc dù kích thước cửa sổ là kích thước của toàn bộ khung SVG, giải pháp này trả lời câu hỏi của tôi (trong khi, tất nhiên, nâng một câu hỏi khác). :) –
Điều này cực kỳ hữu ích, mặc dù nhiều trợ giúp hơn sẽ hữu ích. Để render một phần của ảnh SVG, bạn có thể sử dụng handle.render_cairo (cr = c, id = "# layer_5") trong đó "c" là ngữ cảnh cairo. Phần không rõ ràng với tôi là "#" ở đầu id là bắt buộc. SVG của tôi có id như 'id =' layer_1 '' và tôi có thể hiển thị từng lớp riêng lẻ với render_cairo (cr = c, id = "# layer_1") – bodgesoc