簡體   English   中英

如何將python kivy應用程序加載器轉換為exe?

[英]How to convert python kivy app loader in to exe?

我嘗試了網絡上的大多數解決方案,但都沒有奏效。
我已經測試了pyinstaller、py2exe、cxfreeze在 Windows 上編譯時這些都不起作用

但是,當我在 linux 上使用 pyinstaller編譯它時。
exe 的大小約為500mb ,int包括 linux os 文件
它在 windows 和 linux 下的 wine 上運行良好。
為了減小大小,我嘗試了 virtualenv,但沒有成功。

然后

我試圖在 windows 系統上編譯它,但到目前為止沒有成功。

我正在共享需要轉換為 exe 的基本 loder main.py。 以及一個名為 BasicClasses的必需編譯文件 ( .pyd)。 ....*.pyd

運行 main.py 時,它應該一鍵顯示 kivy 應用程序。

所需的包在 main.py 中導入

任何人都可以在可以加載BasicClasses.pyd的Windows系統上共享main.py的exe

和步驟。 如果我的代碼中有錯誤,請指出。

主文件

#!/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()

基本類.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 可以使用帶有 setup.py 和 compile.bat 文件的 cython 包編譯為二進制文件

設置文件

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

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

如果你想從頭開始,做pyi-makespec name.py從這個來源: https://pyinstaller.readthedocs.io/en/stable/spec-files.html

然后編輯規范文件以添加 kivy 依賴項。 您需要導入 sdl2、glew 等。以這個規范文件為例: 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 是根據使用PyInstaller (--onefile) 捆綁數據文件使用相對路徑

要將 .py 轉換為 .exe:

轉到您的 python 安裝目錄,然后使用Ctrl + Shift並右鍵單擊空白區域,然后選擇打開命令菜單。 在命令窗口中輸入“pip install pyinstaller 模塊

然后創建文件夾並將您的 .py 文件粘貼到文件夾中,然后使用 control shift 打開命令提示符並右鍵單擊,然后鍵入“pyinstaller --onefile -w 然后您的 Python 腳本名稱並單擊 Enter。然后為您生成文件需要時間在名為 Dist 的同一目錄文件夾中,您將看到您已將文件轉換為 exe。雙擊並運行它的可移植文件,因此它將花費不到一分鍾的時間並正常工作。

有關更多詳細信息,請訪問此鏈接: https : //youtu.be/5AA5i2OlsmQ

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM