Search code examples
google-cloud-firestorekivypyinstallerkivymd

Convert Kivymd code to .exe (Windows executable)


I tried so much to convert kivymd code into .exe by using PyInstaller

the error i getting was -modulenotfound no module named kivy.graphics.buffer while solving this error too many other error occured Temp//kivy_install//data//style.kv also not console is visible it direct crases

my kivy md code :

import os, sys
from kivy.resources import resource_add_path
from kivy.lang import Builder

from kivymd.app import MDApp

KV = '''
MDScreen:

    MDIconButton:
        icon: "language-python"
        pos_hint: {"center_x": .5, "center_y": .5}
'''


class Example(MDApp):
    def build(self):
        return Builder.load_string(KV)



if __name__ == "__main__":
    # these lines should be added
    if hasattr(sys, '_MEIPASS'):
        resource_add_path(os.path.join(sys._MEIPASS))
    ###
    Example().run()

My spect file:

# -*- mode: python ; coding: utf-8 -*-
import sys
import os
from PyInstaller.building.build_main import *
path = os.path.abspath(".")
kivymd_repo_path = path.split("demos")[0]
sys.path.insert(0, kivymd_repo_path)
from kivy_deps import sdl2, glew
from kivymd import hooks_path as kivymd_hooks_path


added_files = [                      
]



a = Analysis(['main.py'],
             pathex=['C:\\Program Files\\Python37\\Lib\\site-packages\\kivy'],
             binaries=[],
             datas=[],
    hiddenimports=['kivy.weakmethod',

        "libs.baseclass.bottom_app_bar",
        "libs.baseclass.bottom_sheet",
        "libs.baseclass.cards",
        "libs.baseclass.chips",
        "libs.baseclass.data_tables",
        "libs.baseclass.dialog_change_theme",
        "libs.baseclass.dialogs",
        "libs.baseclass.drop_item",
        "libs.baseclass.expansionpanel",
        "libs.baseclass.filemanager",
        "libs.baseclass.grid",
        "libs.baseclass.home",
        "libs.baseclass.list_items",
        "libs.baseclass.md_icons",
        "libs.baseclass.menu",
        "libs.baseclass.navigation_drawer",
        "libs.baseclass.pickers",
        "libs.baseclass.refresh_layout",
        "libs.baseclass.snackbar",
        "libs.baseclass.stack_buttons",
        "libs.baseclass.tabs",
        "libs.baseclass.taptargetview",
        "libs.baseclass.textfields",
        "libs.baseclass.toggle_button",
        "libs.baseclass.toolbar",
        "libs.baseclass.user_animation_card",
        "kivymd.stiffscroll",],
    hookspath=[kivymd_hooks_path],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=None,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=None)


exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,             
    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
    debug=False,
    strip=False,
    upx=True,
    name="mynaddddme",                      
    console=True,   
)

Solution

  • Your .spec file seems overly complicated. Here is a main.spec file that works for me and your main.py:

    # -*- mode: python ; coding: utf-8 -*-
    
    from kivy_deps import sdl2, glew
    
    block_cipher = None
    
    
    a = Analysis(['main.py'],
                 pathex=[],
                 binaries=[],
                 datas=[],
                 hiddenimports=[],
                 hookspath=[],
                 hooksconfig={},
                 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='main',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              upx_exclude=[],
              runtime_tmpdir=None,
              console=True,
              disable_windowed_traceback=False,
              target_arch=None,
              codesign_identity=None,
              entitlements_file=None )
    

    And just run pyinstaller main.spec. This should create a single file executable main.exe.