在kivy论坛中没有得到回应,因此请在这里尝试。
当我将教程pong代码编译为一个文件可执行文件时,我仍然必须将pong.kv文件包含在同一文件夹中才能运行。否则,启动exe时出现以下错误:
GL:支持EXT_framebuffer_object [INFO] [GL] OpenGL版本 [INFO] [GL] OpenGL供应商 [INFO] [GL] OpenGL渲染器 [INFO] [GL] OpenGL解析的版本:2、1 [INFO] [GL]底纹版本 [INFO] [GL]纹理最大尺寸 [INFO] [GL]纹理最大单位 [信息] [窗口]自动添加sdl2输入提供程序 [INFO] [Window]虚拟键盘不允许, 单模,不对接 追溯(最近一次通话): 在第81行的文件“”中 文件“ c:\ python34 \ lib \ site-packages \ kivy \ app.py”,第802行,位于 跑 根= self.build() 文件“”,第75行,在构建中 在serveBall中的文件“”,第20行 AttributeError:“ NoneType”对象没有属性“ center” 主要返回-1
如何使它作为一个可执行文件运行。这是我的pong.spec文件:
# -*- mode: python -*- from kivy.deps import sdl2, glew block_cipher = None a = Analysis(['Code\main.py'], pathex=['E:\\Development\\Pong'], binaries=None, datas=None, hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) a.datas += [('Code\pong.kv', 'E:\\Development\\Pong\Code\pong.kv', 'DATA')] exe = EXE(pyz,Tree('Code'), a.scripts, a.binaries, a.zipfiles, a.datas, *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)], name='pong', debug=False, strip=False, upx=True, console=True , icon='pong.ico')
请注意,我尝试将pong.kv包括在数据列表中,但这没有帮助。
谢谢,-Raj
根据KeyWeeUsr提供的链接(将数据文件与PyInstaller捆绑在一起,并使用PyInstaller从Python脚本制作EXE)并将其与Kivy的资源路径方法结合起来,这是一个可行的解决方案。我觉得这有点麻烦,因为它使用SYS._MEIPASS(我希望使用公共API),并且需要在您的Python代码中添加代码段。但是,该解决方案可以在Windows和Mac上运行,因此可以共享。
假设我具有以下代码层次结构:
MyCode / MyApp.py(这是主程序) myapp.kv(这是关联的kv文件) MyData /(这是应用程序使用的数据所在的位置) myapp.icns(例如Mac的图标文件) myapp.ico(例如Windows的图标文件) 建立/ 苹果电脑/ myapp.spec(在Mac平台上构建的spec文件) 电脑/ myapp.spec(在Windows平台上构建的规范文件) MyHiddenImports /(包含用于隐藏导入的python文件的文件夹)
我在示例中添加了MyHiddenImports文件夹,以防您的代码在运行时还将包含python代码的另一个文件夹附加到sys.path中。
在MyApp.py中添加以下内容:
def resourcePath(): '''Returns path containing content - either locally or in pyinstaller tmp file''' if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS) return os.path.join(os.path.abspath(".")) if __name__ == '__main__': kivy.resources.resource_add_path(resourcePath()) # add this line my_app = MyApp()
resources_add_path()告诉Kivy在哪里寻找data / .kv文件。例如,在Mac上,运行pyinstaller应用程序时,它指向/ private / var / folders / 80 / y766cxq10fb_794019j7qgnh0000gn / T / _MEI25602,在Windows中,它指向c:\ users \ raj \ AppData \ Local \ Temp_MEI64zTut(这些文件夹会在退出应用后被删除,并在再次启动时创建另一个名称)。
我使用以下命令创建了初始Mac模板规范文件:
pyinstaller –onefile -y –clean –windowed –name myapp –icon = .. / .. / Code / Data / myapp.icns –exclude-module _tkinter –exclude-module Tkinter –exclude-module附魔–exclude-module扭曲../../Code/MyApp.py
这是修改后的Mac OS Spec文件:
# -*- mode: python -*- block_cipher = None a = Analysis(['../../Code/MyApp.py'], pathex=['/Users/raj/Development/Build/mac', '../../MyHiddenImports'], binaries=None, datas=None, hiddenimports=['MyHiddenImports'], hookspath=[], runtime_hooks=[], excludes=['_tkinter', 'Tkinter', 'enchant', 'twisted'], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) a.datas += [('myapp.kv', '../../MyCode/my.kv', 'DATA')] exe = EXE(pyz, Tree('../../Code/Data', 'Data'), a.scripts, a.binaries, a.zipfiles, a.datas, name='myapp', debug=False, strip=False, upx=True, console=False , icon='../../Code/Data/myapp.icns') app = BUNDLE(exe, name='myapp.app', icon='../../Code/Data/myapp.icns', bundle_identifier=None)
注意事项:我将隐藏导入路径添加到pathex,并在hiddenimports中引用了该包。我将myapp.kv文件附加到a.datas,因此它将被复制到应用程序中。在EXE中,我添加了数据树。我包括了prefix参数,因为我希望将Data文件夹复制到应用程序中(而不是让孩子坐在根目录下)。
要编译代码以创建应用程序并将其放入dmg文件中,我有一个make-myapp脚本,该脚本执行以下操作:
pyinstaller -y --clean --windowed myapp.spec 推dist hdiutil create ./myapp.dmg -srcfolder myapp.app -ov 弹出 cp ./dist/myapp.dmg。
同样,这是Windows规格文件:
# -*- mode: python -*- from kivy.deps import sdl2, glew block_cipher = None a = Analysis(['..\\..\\Code\\Cobbler.py'], pathex=['E:\\Development\\MyApp\\Build\\pc', '..\\..\\MyHiddenImports'], binaries=None, datas=None, hiddenimports=['MyHiddenImports'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) a.datas += [('myapp.kv', '../../Code/myapp.kv', 'DATA')] exe = EXE(pyz, Tree('..\\..\\Code\\Data','Data'), a.scripts, a.binaries, a.zipfiles, a.datas, *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)], name='myapp', debug=False, strip=False, upx=True, console=False, icon='..\\..\\Code\\Data\\myapp.ico' )
并编译Windows应用程序:
python -m PyInstaller myapp.spec