将Kivy应用程序编译为Windows可执行文件

时间:2018-06-25 13:05:23

标签: python python-3.x kivy pyinstaller

过去一周来,我一直在与PyInstaller战斗,试图使我的应用程序编译成一个可执行文件。

我用.spec文件尝试了几种不同的实现,在尝试的许多方法中,我可以将其编译成一个可执行文件,该可执行文件在启动时立即崩溃,根本无法启动,或者运行,但是非常慢。与我用尽PyCharm时相比,没什么。

我不确定运行速度是否慢是由于编译器或其他原因造成的,但是当我通过PyCharm运行执行任务时,执行任务大约需要1-2秒,但是从可执行文件运行时大约需要30-35秒,应用程序就会挂起。

我的应用程序本质上是从TextInput框中获取一些文本,从它们中获取文本值,进行一些SQL查询,然后提交适当的信息以将条目信息更新/添加到访问数据库中。

我最新的.spec文件如下:

# -*- mode: python -*-

import pyodbc

from datetime                   import date
from kivy.app                   import App
from kivy.uix.button            import Button
from kivy.uix.boxlayout         import BoxLayout
from kivy.uix.label             import Label
from kivy.uix.popup             import Popup
from kivy.uix.textinput         import TextInput
from kivy.lang                  import Builder
from kivy.properties            import BooleanProperty, ObjectProperty
from kivy.deps import sdl2, glew

block_cipher = None


a = Analysis(['DBInterfaceAssistant.py'],
             pathex=['C:\\Python36-32'],
             binaries=[],
             datas=[],
             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)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='DBInterfaceAssistant',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

该产品的产品是无法启动的应用程序,它尝试加载该应用程序但立即崩溃。

---编辑---

我当前的构建脚本如下:

# -*- mode: python -*-

import pyodbc

from datetime                   import date
from kivy.app                   import App
from kivy.uix.button            import Button
from kivy.uix.boxlayout         import BoxLayout
from kivy.uix.label             import Label
from kivy.uix.popup             import Popup
from kivy.uix.textinput         import TextInput
from kivy.lang                  import Builder
from kivy.properties            import BooleanProperty, ObjectProperty
from kivy.deps import sdl2, glew
from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal, get_deps_all, hookspath, runtime_hooks

block_cipher = None


a = Analysis(['DBInterfaceAssistant.py'],
             pathex=['C:\\Python36-32'],
             binaries=[],
             datas=[],
             hookspath=hookspath(),
             runtime_hooks=runtime_hooks(),
             ** get_deps_all())
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='DBInterfaceAssistant',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

1 个答案:

答案 0 :(得分:0)

您可以使用 Kivy 文档中的示例:

from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal, get_deps_all, hookspath, runtime_hooks
a = Analysis(['examples-path\\demo\\touchtracer\\main.py'],
         ...
         hookspath=hookspath(),
         runtime_hooks=runtime_hooks(),
         ...
         **get_deps_all())

coll = COLLECT(exe, Tree('examples-path\\demo\\touchtracer\\'),
           a.binaries,
           a.zipfiles,
           a.datas,
           *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
           strip=False,
           upx=True,
           name='touchtracer')

https://kivy.org/docs/guide/packaging-windows.html#overwrite-win-hook