【问题标题】:Kivy App Quitting When ClickingKivy 应用程序单击时退出
【发布时间】:2017-11-11 00:22:27
【问题描述】:

我一直在尝试使用 pyinstaller 将 kivy 应用程序转换为 exe 文件,但它一直给我错误。正如website 上所述,我已经完成了我必须做的事情。 我在用: Mac mini (Late 2014) 2.6 GHz Intel Core i5 Version 10.12.6 python 3.6.1 PyInstaller: 3.3 Platform: Darwin-16.7.0-x86_64-i386-64bit kivy 1.10.1

这是我的 main.py 的样子:

import kivy
kivy.require('1.0.6') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):

    def build(self):
        return Label(text='Hello world')
if __name__ == '__main__':
    MyApp().run()

我已经使用 pyinstaller 运行以下命令:

pyinstaller -y --clean --windowed --name simple \
  --exclude-module _tkinter \
  --exclude-module Tkinter \
  --exclude-module enchant \
  --exclude-module twisted \
  main.py

它一直给我这个错误:

我试图忽略它,并继续按照website 上所说的去做。也就是添加树对象:

coll = COLLECT(exe,
               Tree('/Users/mohammadmohjoub/PycharmProjects/Kivy'), 
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='simple')

并运行以下命令: pyinstaller -y --clean --windowed simple.spec

现在情况变得更糟了,因为我遇到了与上面相同的错误,还有这个新错误: WARNING: stderr: FileNotFoundError: [Errno 2] No such file or directory: '/Users/mohammadmohjoub/PycharmProjects/Kivy/dist/simple.app/Contents/Resources/lib2to3/Grammar.txt'

ModuleNotFoundError 错误和FileNotFoundError 错误的原因是什么?这就是为什么每次我尝试打开应用程序时它都会立即关闭的原因吗?如果这不是原因,那么我如何才能以不会使其意外关闭的方式构建应用程序?几周以来我一直在努力解决这个问题。我真的很感激任何形式的支持。

【问题讨论】:

    标签: kivy pyinstaller python-3.6


    【解决方案1】:

    1) 对于第一个错误(未找到模块)。我对您为什么使用 --exclude-module 标志感到困惑。如果您的项目依赖于这些模块,则需要将它们与您的脚本打包在一起。事实上,您甚至可能需要使用 --hidden-import 标志来识别 pyinstaller 可能找不到的模块。

    https://pyinstaller.readthedocs.io/en/stable/usage.html

    此链接为您提供有关--hidden-import 标志的信息。但如果所有路径都设置正确,这可能不是必需的。但作为一个例子:

    pyinstaller -y --clean --windowed --hidden-import=module_name simple.py
    

    注意 您可能需要提供隐藏导入模块的完整路径。您可以使用 --paths="path\to\your\module" 标志添加它。这将告诉 pyinstaller 在哪里寻找东西。您也可以将完整文件路径添加到 --hidden-import 标志。无论哪种方式,您都需要在某处指定完整路径(您也可以在规范文件中编辑 pathex 变量)。

    2) 对于第二个错误(找不到文件)。如果您的代码访问外部文件(例如 Grammar.txt)。它也需要与 pyinstaller 捆绑在一起。当 pyinstaller 编译您的代码时,它会创建一个“dist”目录,您可以在其中运行代码,但您的 python 脚本(我假设)正在根据原始脚本的相对位置查找此文件。因此,您需要将文件复制到您的目录,或者在编译时使用--add-data 标志。上面的链接也提供了有关该标志的信息。

    pyinstaller -y --clean --windowed --add-data="src:dest" simple.py
    

    另一种解决方案是只编辑规范文件以包含所有内容:

    a = Analysis(['minimal.py'],
        ...
        datas=[('src/Grammar.txt', '.'), ('another/src/more.txt', '.')]
        hiddenimports=['path_to_import', 'path_to_second_import'],
        ...
        cipher=block_cipher)
    pyz = PYZ(a.pure, a.zipped_data,
        cipher=block_cipher)
    exe = EXE(pyz,... )
    coll = COLLECT(...)
    app = BUNDLE(...)
    

    那么你可以这样做:pyinstaller your.spec

    有关规范文件的更多信息:https://pyinstaller.readthedocs.io/en/stable/spec-files.html

    【讨论】:

    • 我已经尝试了您建议的所有方法,但遗憾的是没有任何效果。错误不断出现,我一点击应用就一直关闭。
    • @MohammadMahjoub 哪些错误一直出现?
    • 您可以发布您正在使用的规范文件吗?编译的时候也有警告吗?
    • 因为我在运行时同时遇到enchant - ModuleNotFoundError: No module named 'enchant'osxappkit - ModuleNotFoundError: No module named 'AppKit' 错误:pyinstaller -y --clean --windowed --name simple \ --exclude-module _tkinter \ --exclude-module Tkinter \ --exclude-module enchant \ --exclude-module twisted \ simple.py,所以我运行了这个:pyinstaller -y --clean --windowed --hidden-import=enchant --hidden-import=AppKit simple.py 但它仍然给我同样的错误。即No module named 'enchant'No module named 'AppKit'
    • 编译时有警告吗?附魔和 AppKit 在你的道路上吗?
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2012-08-31
    • 2012-02-04
    相关资源
    最近更新 更多