【问题标题】:How to convert python kivy app loader in to exe?如何将 python kivy 应用程序加载器转换为 exe?
【发布时间】:2021-09-18 13:11:03
【问题描述】:

我尝试了网络上的大多数解决方案,但都没有奏效。
我已经测试过pyinstaller、py2exe、cxfreeze 在 Windows 上编译时,这些都不起作用。

但是,当我在 linux 上使用 pyinstaller 编译它时。
exe 的大小约为 500mb 和 int 包括所以可能的 linux os 文件
它在 Windows 和 linux 下的 wine 上运行良好。
为了减小大小,我尝试了 virtualenv,但没有成功。

然后

我尝试在windows系统上编译,但目前没有成功。

我正在共享需要转换为 exe 的基本加载程序 main.py。以及一个名为 BasicClasses 的必需编译文件 (.pyd)。....*.pyd

当运行 main.py 时,它应该显示一个按钮的 kivy 应用程序。

需要的包被导入到main.py中

任何人都可以分享windows系统下main.py的exe文件可以加载BasicClasses.pyd

和步骤。如果我的代码有错误请指出。

main.py

#!/bin/python3
##import kivy
import cython
import os
if os.name == 'nt':
    from kivy_deps import sdl2, glew
import pyautogui
###import mouse
#import cv2
#import os, sys
#from pathlib import Path
#from kivy.resources import resource_add_path, resource_find
#from kivy.base import runTouchApp
from openpyxl import load_workbook
#from os.path import abspath
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.switch import Switch
from kivy.uix.label import Label
#from kivy.uix.widget import Widget
##from kivy.uix.canvas import Canvas
from kivy.graphics import Rectangle, Color, Line
#from kivy.graphics import *
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.pagelayout import PageLayout
from kivy.uix.stacklayout import StackLayout
#from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.filechooser import FileChooserListView
from kivy.properties import ObjectProperty, StringProperty, ColorProperty,NumericProperty
from kivy.uix.textinput import TextInput
#from kivy.core.window import Window
#from kivy.clock import Clock
from kivy.metrics import dp
from kivy.effects.dampedscroll import DampedScrollEffect
##from kivy.effects.scrolleffect import ScrollEffect
#from functools import partial
#from kivy.animation import Animation
import webbrowser
from kivy.config import Config
from BasicClasses import *


root = MainWindow()

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

BasicClasses.py


import os
import sys
import cython
import kivy
#import BasicClasses
import pyautogui
import openpyxl
from openpyxl import load_workbook
###import mouse
#import cv2
#import os, sys
#from pathlib import Path
#from kivy.resources import resource_add_path, resource_find
#from kivy.base import runTouchApp
from openpyxl import load_workbook
#from os.path import abspath
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.switch import Switch
from kivy.uix.label import Label
#from kivy.uix.widget import Widget
##from kivy.uix.canvas import Canvas
from kivy.graphics import Rectangle, Color, Line
#from kivy.graphics import *
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.pagelayout import PageLayout
from kivy.uix.stacklayout import StackLayout
#from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.filechooser import FileChooserListView
from kivy.properties import ObjectProperty, StringProperty, ColorProperty,NumericProperty
from kivy.uix.textinput import TextInput
#from kivy.core.window import Window
#from kivy.clock import Clock
from kivy.metrics import dp
from kivy.effects.dampedscroll import DampedScrollEffect
##from kivy.effects.scrolleffect import ScrollEffect
#from functools import partial
#from kivy.animation import Animation
#import webbrowser
from kivy.config import Config
ICON='./icon.ico'
Config.set('kivy','window_icon',ICON)


if os.name == 'nt':
    from kivy_deps import sdl2, glew

class Main(Button):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.text='HI'


class MainWindow(App):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        global ICON
        self.icon=ICON
        print('MainWindow in Classes')

    def build(self):
        return Main()


if __name__=='__main__':
    MainWindow().run()

BasicClasses.py 可以使用 cython 包编译成二进制 用 setup.py 和 compile.bat 文件作为

setup.py

from distutils.core import Extension, setup
from Cython.Build import cythonize

import os
import sys
import cython
#import BasicClasses
import pyautogui
import openpyxl
from openpyxl import load_workbook
###import mouse
#import cv2
#import os, sys
#from pathlib import Path
#from kivy.resources import resource_add_path, resource_find
#from kivy.base import runTouchApp
from openpyxl import load_workbook
#from os.path import abspath
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.switch import Switch
from kivy.uix.label import Label
#from kivy.uix.widget import Widget
##from kivy.uix.canvas import Canvas
from kivy.graphics import Rectangle, Color, Line
#from kivy.graphics import *
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.pagelayout import PageLayout
from kivy.uix.stacklayout import StackLayout
#from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.filechooser import FileChooserListView
from kivy.properties import ObjectProperty, StringProperty, ColorProperty,NumericProperty
from kivy.uix.textinput import TextInput
#from kivy.core.window import Window
#from kivy.clock import Clock
from kivy.metrics import dp
from kivy.effects.dampedscroll import DampedScrollEffect
##from kivy.effects.scrolleffect import ScrollEffect
#from functools import partial
#from kivy.animation import Animation
#import webbrowser
if os.name == 'nt':
    from kivy_deps import sdl2, glew




# define an extension that will be cythonized and compiled
ext = Extension(name="BasicClasses", sources=["BasicClasses.py"])
setup(ext_modules=cythonize(ext))

##run as 
##python setup.py build_ext --inplace
##python3 setup.py build_ext --inplace

编译.bat

python setup.py build_ext --inplace
python3 setup.py build_ext --inplace

【问题讨论】:

  • “但是,当我在 linux 上使用 pyinstaller 编译它时。exe 的大小约为 500mb 并且 int 包括 linux os 文件”——这可能正是您使用的所有依赖项加起来的结果。
  • 你看过文档了吗? kivy.org/doc/stable/guide/packaging.html
  • 信息不足。你的pyinstaller 是什么版本?什么是构建日志?

标签: python kivy pyinstaller cython py2exe


【解决方案1】:

这家伙的回答真的很有帮助: Can't pyinstall a Kivy python program

如果您想从头开始,请从以下来源执行pyi-makespec name.pyhttps://pyinstaller.readthedocs.io/en/stable/spec-files.html

然后您编辑规范文件以添加 kivy 依赖项。需要导入sdl2、glew等,看这个spec文件举例:How to get an windows executable from my kivy app (Pyinstaller)?

现在你说你处于 kivy 运行的地步,但没有窗口——只是一个黑屏。这是因为当您使用 --onefile 而不是 --onedir 创建应用程序时,pyinstaller 会将所有文件提取到 _MEIxxxxxx 文件夹中。所以 kivy 正在寻找错误的文件夹来加载你的 kv 文件。因此,这里详细介绍了如何使用相对路径来解决此问题:Bundling data files with PyInstaller (--onefile)

有两个混乱/简单的解决方案,第三个最佳解决方案是上一个链接。

#1 只是将您的 kv 文件作为字符串加载并将其放在您的主 py 文件夹中。很乱

#2 只是将sys._MEIPASS 附加到所有资源文件中。例如,如果您使用os.getcwd()+"\\Resources\\ICON.ico",那么 kivy 可执行文件将不会在 MEIPASS 文件夹中查找。要修复,只需执行sys._MEIPASS + "\\Resources\\ICON.ico" kivy 窗口是黑色的,因为当您使用 pyinstaller 创建 --onefile 时它无法找到您的 kv 文件,但在 --onedir 中,您的相对路径应该可以找到 kv 文件。这样做的问题是你最终会制作你的主 py 的第二个副本,事情会变得一团糟。

#3 是按照Bundling data files with PyInstaller (--onefile)使用相对路径

【讨论】:

    【解决方案2】:

    将 .py 转换为 .exe:

    转到你的 python 安装目录 然后使用 Ctrl + Shift 并右键单击空白区域,然后选择打开命令菜单。在命令窗口中输入“pip install pyinstaller 模块

    然后创建文件夹并将您的 .py 文件粘贴到文件夹中,然后使用 control shift 打开命令提示符并右键单击然后输入“pyinstaller --onefile -w 然后输入您的 python 脚本名称并单击 Enter。生成文件需要一些时间然后在名为 Dist 的同一目录文件夹中转到您将看到您将文件转换为 exe。双击并运行其便携版,这样只需不到一分钟即可正常工作。

    更多详情请访问此链接:https://youtu.be/5AA5i2OlsmQ

    【讨论】:

    • "I tried most of the solutions in the web however none of them is working. I have tested pyinstaller, py2exe, cxfreeze none of this works when compiled on windows."我的家伙,你甚至没有读过这个问题,你已经回答了
    • 我真的不明白你。是不是你试图用 Pyinstaller 创建一个可执行文件,但它在启动时崩溃了?
    • 使用 pyinstaller 会导致 sdl2 出错,所以我在安装了一些额外的 kivy 依赖项后,通过修改规范文件和重新计算来修复它,但是它现在不会启动或 git 任何错误。 windows命令终端也没有报错,生成的main.exe文件大小为22mb。
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2015-08-06
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多