2024-04-26 22:32:00 发布
网友
在pyGame应用程序中,我想呈现SVG中描述的无分辨率GUI小部件。
我可以使用什么工具和/或库来实现这个目标?
(我喜欢OCEMP GUI工具包,但它的呈现似乎依赖于位图)
这是一个完整的例子,它结合了这里其他人的提示。 它应该从当前目录呈现一个名为test.svg的文件。它在Ubuntu10.10、PythonCairo1.8.8、PythonPyGame1.9.1、PythonRSVG2.30.0上进行了测试。
#!/usr/bin/python import array import math import cairo import pygame import rsvg WIDTH = 512 HEIGHT = 512 data = array.array('c', chr(0) * WIDTH * HEIGHT * 4) surface = cairo.ImageSurface.create_for_data( data, cairo.FORMAT_ARGB32, WIDTH, HEIGHT, WIDTH * 4) pygame.init() window = pygame.display.set_mode((WIDTH, HEIGHT)) svg = rsvg.Handle(file="test.svg") ctx = cairo.Context(surface) svg.render_cairo(ctx) screen = pygame.display.get_surface() image = pygame.image.frombuffer(data.tostring(), (WIDTH, HEIGHT),"ARGB") screen.blit(image, (0, 0)) pygame.display.flip() clock = pygame.time.Clock() while True: clock.tick(15) for event in pygame.event.get(): if event.type == pygame.QUIT: raise SystemExit
您可以使用Cairo(与PyCairo一起使用),PyCairo支持呈现svg。PyGame网页有一个HOWTO用于使用Cairo呈现到缓冲区中,并直接将该缓冲区用于PyGame。
这个问题已经很老了,但10年过去了,有了一种新的可能性,这种可能性是可行的,不再需要librsvg。有Cython wrapper over nanosvg library并且它工作:
librsvg
from svg import Parser, Rasterizer def load_svg(filename, surface, position, size=None): if size is None: w = surface.get_width() h = surface.get_height() else: w, h = size svg = Parser.parse_file(filename) rast = Rasterizer() buff = rast.rasterize(svg, w, h) image = pygame.image.frombuffer(buff, (w, h), 'ARGB') surface.blit(image, position)
我发现Cairo/rsvg解决方案太复杂了,无法工作,因为依赖关系很难安装。
这是一个完整的例子,它结合了这里其他人的提示。 它应该从当前目录呈现一个名为test.svg的文件。它在Ubuntu10.10、PythonCairo1.8.8、PythonPyGame1.9.1、PythonRSVG2.30.0上进行了测试。
您可以使用Cairo(与PyCairo一起使用),PyCairo支持呈现svg。PyGame网页有一个HOWTO用于使用Cairo呈现到缓冲区中,并直接将该缓冲区用于PyGame。
这个问题已经很老了,但10年过去了,有了一种新的可能性,这种可能性是可行的,不再需要
librsvg
。有Cython wrapper over nanosvg library并且它工作:我发现Cairo/rsvg解决方案太复杂了,无法工作,因为依赖关系很难安装。
相关问题 更多 >
编程相关推荐