使用auto-py-to-exe打包含图片的Kivy程序为EXE时加载图片失败
Kivy程序打包EXE后SDL2无法加载图片的解决方法
程序代码
test.kv文件
MainWidget: <MainWidget>: canvas.before: Rectangle: size:self.size source:'bgi.jpg'
Main.py文件
from kivy.app import App from kivy.uix.widget import Widget class MainWidget(Widget):pass class TestApp(App):pass TestApp().run()
打包后报错信息
Traceback (most recent call last): File "kivy\lang\builder.py", line 925, in _build_canvas File "kivy\graphics\instructions.pyx", line 380, in kivy.graphics.instructions.VertexInstruction.source.__set__ File "kivy\graphics\context_instructions.pyx", line 431, in kivy.graphics.context_instructions.BindTexture.source.__set__ File "kivy\core\image\__init__.py", line 561, in __init__ File "kivy\core\image\__init__.py", line 754, in _set_filename File "kivy\core\image\__init__.py", line 460, in load File "kivy\core\image\__init__.py", line 223, in __init__ File "kivy\core\image\img_sdl2.py", line 47, in load Exception: SDL2: Unable to load image During handling of the above exception, another exception occurred: Traceback (most recent call last): File "Main.py", line 9, in <module> File "kivy\app.py", line 954, in run File "kivy\app.py", line 923, in _run_prepare File "kivy\app.py", line 696, in load_kv File "kivy\lang\builder.py", line 305, in load_file File "kivy\lang\builder.py", line 405, in load_string File "kivy\uix\widget.py", line 470, in apply_class_lang_rules File "kivy\lang\builder.py", line 540, in apply File "kivy\lang\builder.py", line 595, in _apply_rule File "kivy\lang\builder.py", line 928, in _build_canvas kivy.lang.builder.BuilderException: Parser: File "C:\Users\User\Documents\Python scripts\Python class\Kivy projects\exe test\Main with image\test.kv", line 6: ... 4: Rectangle: 5: size:self.size >> 6: source:'bgi.jpg' 7: Label: 8: id:lbl ... Exception: SDL2: Unable to load image File "kivy\lang\builder.py", line 925, in _build_canvas File "kivy\graphics\instructions.pyx", line 380, in kivy.graphics.instructions.VertexInstruction.source.__set__ File "kivy\graphics\context_instructions.pyx", line 431, in kivy.graphics.context_instructions.BindTexture.source.__set__ File "kivy\core\image\__init__.py", line 561, in __init__ File "kivy\core\image\__init__.py", line 754, in _set_filename File "kivy\core\image\__init__.py", line 460, in load File "kivy\core\image\__init__.py", line 223, in __init__ File "kivy\core\image\img_sdl2.py", line 47, in load
解决步骤
1. 修正资源路径定位
打包后程序的工作目录与开发环境不同,直接使用相对路径会导致找不到图片。修改代码,用Kivy内置的资源查找函数获取正确路径:
修改后的Main.py:
from kivy.app import App from kivy.uix.widget import Widget from kivy.resources import resource_find class MainWidget(Widget): def __init__(self, **kwargs): super().__init__(**kwargs) self.image_path = resource_find('bgi.jpg') class TestApp(App): pass if __name__ == "__main__": TestApp().run()
对应的test.kv修改:
MainWidget: <MainWidget>: canvas.before: Rectangle: size:self.size source:self.image_path
2. 检查auto-py-to-exe的附加文件配置
- 在auto-py-to-exe界面的Additional Files区域,点击
Add Files,分别添加test.kv和bgi.jpg。 - 打包完成后,确保生成的exe文件所在目录下,
test.kv和bgi.jpg与exe处于同一层级。
3. 切换图片加载器(可选)
若SDL2加载器仍报错,可切换为PIL加载器,在Main.py开头添加:
from kivy.core.image import Image, ImageLoaderPIL Image.register_loader(ImageLoaderPIL)
4. 手动使用.spec文件打包(进阶)
如果auto-py-to-exe自动配置不稳定,可手动生成.spec文件打包:
- 运行命令:
pyi-makespec Main.py - 打开生成的
Main.spec,在datas列表中添加资源:datas = [('test.kv', '.'), ('bgi.jpg', '.')] - 执行打包命令:
pyinstaller Main.spec
内容的提问来源于stack exchange,提问作者Vishnu Balaji
相关产品推荐
相关产品推荐

