You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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文件打包:

  1. 运行命令:pyi-makespec Main.py
  2. 打开生成的Main.spec,在datas列表中添加资源:
    datas = [('test.kv', '.'), ('bgi.jpg', '.')]
    
  3. 执行打包命令:pyinstaller Main.spec

内容的提问来源于stack exchange,提问作者Vishnu Balaji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:25:20