Pyinstaller编译的Kivy应用无法运行问题求助
解决PyInstaller打包Kivy应用后的运行错误
从你的日志和配置文件来看,主要有两个核心问题导致应用无法运行:Kivy默认资源未被正确打包,以及窗口未初始化就调用set_icon方法。下面是分步解决方案:
1. 修复Kivy默认资源缺失问题
日志里的无法加载图片<C:\Users\jakub\AppData\Local\Temp\_MEI90522\kivy_install\data\glsl\default.png>是关键错误——PyInstaller没有自动包含Kivy自带的资源文件(比如glsl默认图、字体等),导致运行时找不到这些依赖。
你需要修改spec文件,把Kivy的data目录添加到datas列表中:
# -*- mode: python -*- import kivy from kivy.deps import sdl2, glew block_cipher = None a = Analysis(['main.py'], pathex=['C:\\Users\\jakub\\Desktop\\python\\Datelbot'], # 注意转义反斜杠 binaries=[('img/icon.ico', 'img')], # 添加Kivy的data目录和依赖库 datas=[(kivy.kivy_data_dir, 'kivy_install/data')], hiddenimports=['kivy.core.window.window_sdl2', 'kivy.core.image.img_sdl2'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) # 添加SDL2和GLEW的依赖文件 a.datas += sdl2.dep_bins + glew.dep_bins pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='Datelbot.exe', debug=False, strip=False, upx=True, runtime_tmpdir=None, console=True, version='version.py', icon='img\\icon.ico') # 转义反斜杠
2. 修复set_icon的AttributeError
日志最后报错AttributeError: 'NoneType' object has no attribute 'set_icon',这是因为你在窗口还没成功创建时就调用了Window.set_icon()。
修改你的main.py代码,把设置图标的逻辑放到App的on_start方法里,确保窗口已经初始化完成:
from kivy.app import App from kivy.core.window import Window class YourApp(App): def on_start(self): # 确保窗口存在后再设置图标 if Window: Window.set_icon('img/icon.ico') if __name__ == '__main__': YourApp().run()
3. 调整build脚本
你的build.bat可以简化,直接使用修改后的spec文件打包,不需要重复指定参数:
pyinstaller --clean Datelbot.spec
(注意把spec文件名改成你实际的文件名)
额外注意事项
- 路径中的反斜杠要转义成
\\,或者使用正斜杠/,避免Windows路径解析错误。 - 确保你的Kivy和PyInstaller版本兼容:Kivy 1.10.0建议搭配PyInstaller 3.3~3.6版本(过高版本可能有兼容性问题)。
- 打包时加上
--clean参数可以清理旧的缓存文件,避免残留问题。
按照以上步骤修改后,重新打包应该就能正常运行了。
内容的提问来源于stack exchange,提问作者Jakub Bláha
相关产品推荐
相关产品推荐

