[英]How to load a complex SVG into pygame correctly?
我正在使用 python-chess 库在 Python 和 PyGame 中制作国际象棋游戏。
当我在 PyGame 中执行我的程序时,window 只显示没有棋子的空板。 但是,如果我手动打开我的代码生成的 svg 文件,它会正确显示,并且棋子在棋盘上。 问题是 - 当使用blit
在 PyGame 中显示相同的图像时,我得到一块空板。
需要明确的是,这个问题不是一般的“在 PyGame 中加载 SVG”问题。 在此示例中,我成功显示了我的 SVG。 问题是 PyGame/python-chess 问题:
如果是同一个文件,为什么 PyGame 将其中包含棋子的图像加载为空板?
代码:
import pygame as pg
import chess
import chess.svg
import chess.pgn
WIDTH, HEIGHT = 900, 500
WINDOW = pg.display.set_mode((WIDTH,HEIGHT))
pg.display.set_caption('Opening mastery')
FPS = 60
board = chess.BaseBoard()
def get_board_img(brd):
SVG = chess.svg.board(board=brd)
f = open("image.svg", "w")
f.write(SVG)
f.close()
image = ('image.svg')
return image
def main():
clock = pg.time.Clock()
run = True
while run:
clock.tick(FPS)
for event in pg.event.get():
if event.type == pg.QUIT:
run = False
image = get_board_img(board)
WINDOW.blit(pg.image.load(image),(0,0))
pg.display.update()
pg.quit()
if __name__ == '__main__':
main()
这是手动打开生成的SVG文件(里面有碎片)
这是结果(棋盘上没有棋子)
pygame 的 SVG 加载库 (nanosvg) 似乎无法处理 SVG。
我找到了一个解决方法,使用 cairosvg 将 SVG 转换为 PNG,然后使用 pygame 加载它。
我做了一个新的get_board_image
function 直接返回一个表面
def get_board_img(brd):
svg = chess.svg.board(board=brd)
png_io = io.BytesIO()
cairosvg.svg2png(bytestring=bytes(svg, "utf8"), write_to=png_io)
png_io.seek(0)
surf = pg.image.load(png_io, "png")
return surf
它使用 cairosvg 将 svg 字节转换为 pygame 可以加载的 png BytesIO object。
^ 要让该片段在您的代码中工作,您需要添加io
和cairosvg
(并安装 cairosvg)ofc 的导入,并稍微更改主循环:
while run:
clock.tick(FPS)
for event in pg.event.get():
if event.type == pg.QUIT:
run = False
WINDOW.blit(get_board_img(board),(0,0))
pg.display.update()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.