Kivy应用VSCode运行正常,PyInstaller打包EXE后启动报错如何解决?
问题根因
- 代码时序错误:
Window.size = (550, 700)被定义在MyLayout类的类属性层级,这段代码会在模块加载阶段就执行,此时Kivy的App实例还未启动,窗口渲染链路未完成初始化。本地开发时依赖加载速度快未触发问题,打包后资源加载延迟,就会出现Window对象还未实例化就调用size属性的AttributeError。 - 打包遗漏依赖:报错提示
SDL2: Unable to load image是因为PyInstaller打包时没有自动收录Kivy依赖的SDL2动态库、图像解码组件,同时你的spec文件中datas配置为空,项目用到的图标、静态图片等资源没有被打包进EXE,运行时资源加载失败导致窗口初始化终止。
解决方案
1. 修正代码执行时序
将Window大小配置移动到类实例化阶段,确保Kivy初始化完成后再执行:
from kivy.core.window import Window class MyLayout(Widget): # 移除类层级的Window.size配置 def __init__(self, **kwargs): super().__init__(**kwargs) # 放到实例化方法中执行,此时Window已完成初始化 Window.size = (550, 700) class LevermannScore(App): def build(self): return MyLayout() if __name__ == "__main__": LevermannScore().run()
2. 调整spec打包配置
修改你的LevermannApp.spec文件,补全缺失的依赖和资源配置:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['LevermannApp.py'], pathex=['C:\\Users\\Polzi\\Documents\\DEV\\Python-Private'], binaries=[], # 新增静态资源打包配置,根据你实际用到的资源调整 datas=[ ('icons/*.ico', 'icons'), # 如有kv文件、其他图片资源也在此处添加,例如('*.kv', '.') ], # 新增Kivy SDL2相关依赖的隐式导入配置 hiddenimports=[ 'kivy.core.window.window_sdl2', 'kivy.core.image.img_sdl2', 'kivy_deps.sdl2', 'kivy_deps.glew', 'kivy_deps.angle' ], hookspath=[], runtime_hooks=[], excludes=['matplotlib'], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='LevermannApp', debug=False, bootloader_ignore_signals=False, strip=False, # 关闭UPX压缩,避免损坏SDL2动态库 upx=False, upx_exclude=[], runtime_tmpdir=None, console=True , icon='icons\\levermannApp.ico')
3. 重新执行打包
使用修改后的spec文件执行打包命令:pyinstaller LevermannApp.spec
如果打包后仍有报错,可临时将spec中EXE配置的debug=False改为debug=True,运行打包后的程序查看更详细的日志排查缺失依赖。
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

