Pyinstaller 难以通过 Kivy 构建 FileChooserListView

Posted

技术标签:

【中文标题】Pyinstaller 难以通过 Kivy 构建 FileChooserListView【英文标题】:Pyinstaller having difficulty building FileChooserListView via Kivy 【发布时间】:2019-12-15 08:48:41 【问题描述】:

我正在尝试集成 kivy 中包含的文件选择器模块,以允许用户通过 FileChooserListView 获取输入文件的文件字符串,但是当通过 pyinstaller 构建应用程序时,应用程序无法打开。有人碰巧知道问题是什么吗?这是一个示例代码:在 pycharm 中运行良好,但在 pyinstaller 构建时无法打开。

from os.path import exists
from threading import Thread
from sys import exit
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.lang import Builder
from os.path import sep, expanduser, dirname, splitext
from kivy.uix.filechooser import FileChooserListView

KV = '''

<MetaLevel>:
    rows: 2
    cols: 1
    Label:
        text: 'test text'
    Button:
        text: 'test button'
        on_press: root.popup()    

<file_popup>:
    file_chooser: file_chooser
    GridLayout:
        rows:1
        cols:1
        FileChooserListView:
            id: file_chooser
            path: r'C:\\Users'
            on_submit: root.printer()
'''

Builder.load_string(KV)

class MetaLevel(GridLayout):
    def popup(self):
        App.get_running_app().file_popup.open()

class file_popup(Popup):
    def printer(self):
        print(self.file_chooser.path)
        App.get_running_app().file_popup.dismiss()

class Cruncher(App):
    def build(self):
        self.file_popup = file_popup()
        return MetaLevel()


if __name__ == "__main__":
    Cruncher().run()

【问题讨论】:

什么版本的pyinstaller?你的 pyinstaller 命令是什么样的? pyinstaller --version = 3.5,我已经尝试了几乎所有可能的输入,包括基本的“pyinstaller”C:\Users\...“”虽然理想情况下我会使用“pyinstaller --name 名称 --onedir --windowed "C:\Users\..." " 检查 build\(script-name) 文件夹中的 warn-(script-name).txt 文件,我相信你会看到各种各样的错误。 kivy.org/doc/stable/… 更好的指南:kivy.org/doc/stable/guide/… 【参考方案1】:

检查以确保您已安装库:pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew

我确实让您的脚本成功构建,经过一番挖掘,它看起来像 win32file 尤其是 win32timezone 是一些隐藏的导入。

设置: C:/ ..温度/ ....测试/ ......test.py ......TEST.spec

TEST.spec文件:

from kivy_deps import sdl2, glew

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['C:/Temp/Test/test.py'],
             binaries=[],
             datas=[],
             hiddenimports=['win32file','win32timezone'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             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,
          [],
          exclude_binaries=True,
          name='TEST',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False)
coll = COLLECT(exe, Tree('C:\\Temp\\Test\\'),
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               name='TEST')

然后运行pyinstaller C:/Temp/Test/TEST.spec

如果你想要--onefile(我通常会这样做):

TEST.spec文件:

from kivy_deps import sdl2, glew

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['C:/Temp/Test/test.py'],
             binaries=[],
             datas=[],
             hiddenimports=['win32file','win32timezone'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             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,
          *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
          [],
          name='TEST',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False)

【讨论】:

太棒了!我错过了 kivy.deps 库,并且能够将其集成到构建中,结果是成功的。感谢您的帮助。

以上是关于Pyinstaller 难以通过 Kivy 构建 FileChooserListView的主要内容,如果未能解决你的问题,请参考以下文章

无法从使用 PyInstaller 构建的 Kivy 应用程序中获取 lexers.PythonLexer()

导出单个 .exe 时,PyInstaller 卡在“正在构建 PKG ...”

使用 pyinstaller 打包后 Kivy 应用程序崩溃

PyInstaller Kivy ClockApp 示例问题

带有 kivy 的 Pyinstaller - 没有名为“kivy_deps”的模块

如何从我的 kivy 应用程序(Pyinstaller)获取 Windows 可执行文件?