在使用 PyInstaller --onefile 打包 Kivy 应用时是否包含 .kv/.json 文件?

6

我有一个非常简单的应用程序(只是一个带标签的窗口),我正在尝试逐步将其转换为单个可执行文件。这是程序目录:

brainfreeze/
   main.py # simple app
   main.kv # kv language style sheet
   config/
      settings.json # json settings panel data (F1 bound)
saving_to/
   (empty at start)

我已经成功使用PyInstaller将程序编译为可执行文件,但只采用了他们文档中描述的一个文件夹束方法; 我希望改为使用单个文件束方法。到目前为止,当我编译时,应用程序启动但是出现黑屏(传统上,当无法加载main.kv 时,会出现这种情况)。我阅读了这篇文章这篇文章这篇文章,甚至是PyInstaller的文档,但在成功编译成单个可执行文件方面却没有得到任何运作良好的解决方案。以下是prog_test.spec:

# -*- mode: python -*-

from kivy.deps import sdl2
from kivy.deps import glew

block_cipher = None

a = Analysis(['..\\brainfreeze\\main.py'],
             pathex=['H:\\TestBed\\single_exe_test'],
             binaries=[],
             data=[],
             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 += [('../brainfreeze/main.kv', 'DATA'), ('../brainfreeze/config/settings.json', 'DATA')]

exe = EXE(pyz, Tree('../brainfreeze/'),
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
          name='prog_test',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True)

我很好奇是不是 a.datas 的添加方法引起了问题,因为所有的例子都有 3 个索引,而文档只有 2 个索引。我的命令序列如下:
# from the 'saving to' directory
python -m PyInstaller --onefile --name prog_test ../brainfreeze/main.py
# alter the prog_test.spec to the above
python -m PyInstaller --onefile prog_test.spec

我做错了什么,才能够包含支持(.kv,.json)文件?
1个回答

2

我也遇到了一个非常简单的例子的这个问题,并且也读了你提到的同样的文章。同样,当我的应用程序打包在一个文件夹中时,它可以工作,但是当打包在一个单独的exe文件中时就无法工作。 我将kivy应用程序类移动到一个单独的.py文件中,使得主文件看起来像这样:

import os, sys
from kivy.resources import resource_add_path, resource_find
from myApp import AppClass

if __name__ == '__main__':
    if hasattr(sys, '_MEIPASS'):
        resource_add_path(os.path.join(sys._MEIPASS))

    app = AppClass()
    app.run()

在规范文件中,myapp.kv被添加为数据。这对我有用。

我的猜测是,在Python脚本中导入任何其他kivy包之前,kivy资源路径首先需要添加meipass目录。


2
通过这种方法,我能够仅使用命令行构建:pyinstaller --clean -F --add-data="myapp.kv:." myApp.py,而不必担心规范文件。 - badams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接