Kivy to one exe не может найти файл kv - PullRequest
0 голосов
/ 26 мая 2020

Я встречал здесь несколько связанных вопросов и пробовал каждое найденное мной решение, например this и this , но я не мог заставить это работать. Итак, вопрос прост - после создания одного exe-файла из kivy он выдает FileNotFoundError: [Errno 2] No such file or directory: 'main2.kv'. Exe-файл со связанными файлами работает хорошо, но я не знаю, что я делаю не так при создании одного exe.

My spe c файл:

# -*- mode: python ; coding: utf-8 -*-

from kivymd.tools.packaging.pyinstaller import hooks_path as kivymd_hooks_path
from kivy_deps import sdl2, glew
...
a = Analysis(['main.py'],
    ...
    # I tried to write here absolute path, relative path and this method
    datas=[('*.kv', '.')],
    hiddenimports=[],
    hookspath=[kivymd_hooks_path],
    ...
)

# I also tried to put import here - didn't help (when I did that I also tried to change the path in my .py file to 'Data\main2.kv')
# a.datas += [('main2.kv', 'D:\\prog\\Lotto\\main2.kv', 'DATA')]
...

# tried with Tree and without Tree
coll = COLLECT(exe, Tree('D:\\prog\\Lotto','Data'),
    ...
    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
    ...

В файле .py I пробовал добавить

if getattr(sys, 'frozen', False):
    kivy.resources.resource_add_path(sys._MEIPASS)

и

def resourcePath():
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS)
    return os.path.join(os.path.abspath("."))
...

if __name__ == "__main__":
    kivy.resources.resource_add_path(resourcePath())
    MainApp().run()

И пробовал оба вышеперечисленных метода вместе - ничего. Также пытался изменить версию PyInstaller с 3.6 на 3.5. Не знаю, в чем проблема, я впервые пытаюсь сделать exe-файл из Kivy.

1 Ответ

0 голосов
/ 26 мая 2020

Через несколько часов я наконец понял. Сначала я открываю свой kv-файл как file, а затем передаю его Builder, чтобы иметь возможность установить кодировку. В этом случае мне просто нужно было вручную определить путь к файлу kv как sys._MEIPASS + 'main2.kv', и тогда он сработал.

UPD: Чтобы сделать эту работу, сначала сделайте несколько операций импорта:

import os, sys
from kivy.resources import resource_add_path

а затем в конце вашего приложения непосредственно перед MainApp.run () добавьте это:

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

Когда мы создаем один файл .exe, он содержит все файлы внутри него, поэтому он распаковывает его в какой-то случайный временная папка во время работы. sys._MEIPASS вот путь к временной папке.

Так что это должно работать. Если он по-прежнему не может найти файлы, вы можете попробовать изменить путь к файлу следующим образом: например, вместо 'example.kv' напишите sys._MEIPASS + '/' + 'example.kv'.

Также убедитесь, что вы все сделали правильно в. spe c, поэтому вы должны добавить свои файлы в список datas в Analysis, например:

        a = Analysis(['main.py'],
             ...
             datas=[('main.kv', '.'), ('bg.png', '.'), ('CenturyGothic.ttf', '.'), ('finish.mp3', '.'), ('Logo.png', '.'),],

Итак, если у вас есть только kv файл, который нужно добавить, это будет:

datas=[('main.kv', '.')],
...