在pygame中导入.tmx文件时反复出现ElementTree和pytmx报错
问题排查与修复方案
报错根因
你的报错本质是pytmx成功读取.tmx文件后,找不到TMX内部引用的瓦片集图片资源,不是找不到.tmx文件本身,错误触发在pygame.image.load加载瓦片图片的步骤。
常见出错点
- TMX文件内的瓦片集路径是相对路径,该路径是相对于你在Tiled中保存TMX文件的位置,而非Python脚本的运行路径。如果移动过TMX文件、瓦片图文件或者修改过文件夹名称,就会导致路径拼接错误。
- 你代码中存在两处逻辑错误:一是重复加载TMX文件,第12行加载当前运行目录下的
Testmap.tmx,第36行又加载Jodo\maps\map.tmx,首先确认你实际要用的TMX文件存放位置和代码路径一致;二是Windows下路径的反斜杠可能触发转义,建议用原始字符串或者正斜杠写路径。 - 事件循环没有正确的退出逻辑,你定义了
run = False但没有作为循环判断条件,会导致点关闭按钮无法正常退出程序,且绘制逻辑没有写在循环内,只会在启动时绘制一次。
修复步骤
- 先统一项目目录结构,避免路径混乱,参考结构如下:
项目根目录(main.py存放位置) ├─ main.py └─ assets ├─ maps │ └─ Testmap.tmx └─ tiles └─ 你的瓦片集图片.png
- 打开Tiled重新将你的地图保存到上述
assets/maps/路径下,Tiled会自动更新瓦片集的相对路径为相对于TMX文件的路径,保证路径有效性。 - 修改代码中的TMX加载逻辑,用绝对路径避免运行路径变化导致的错误:
import os # 先获取当前脚本的绝对根目录 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) tmx_path = os.path.join(BASE_DIR, "assets", "maps", "Testmap.tmx") # 加载TMX,pytmx会自动基于TMX所在目录拼接瓦片图片路径 game_map = load_pygame(tmx_path, alpha=True)
- 删除代码第36行多余的
tmxdata = load_pygame('Jodo\maps\map.tmx')逻辑,不需要重复加载地图。 - 修正事件循环和绘制逻辑:
run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False # 每帧重绘画面 screen.fill(background) i = 0 for y in range(50): for x in range(50): screen.blit(images[i],(x * 32, y * 32)) i += 1 pygame.display.update() pygame.quit()
内容的提问来源于stack exchange,提问作者Brisolo
相关产品推荐
相关产品推荐

