Сбой приложения Kivy при запуске с помощью Pyinstaller

#python #kivy #pyinstaller

#python #kivy #pyinstaller

Вопрос:

Я использую kivy 1.11.1 с python 3.7.6 Windows 10 и Pyinstall 4.0. Мое приложение работает отлично, и когда я устанавливаю pyinstall pyinstall, все работает правильно. Но когда я запускаю файл, запустите аварийное приложение при запуске.

Часть кода:

 from kivy.app import App
from kivy.base import EventLoop

from kivy.core.audio import SoundLoader

from kivy.utils import get_color_from_hex
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen



Builder.load_string("""
<HomeScreen>:
    BoxLayout:
        orientation: 'vertical'
        canvas.before:
            Color:
                rgba: (0.6, 0.6, 0.6, 0.8)
            Rectangle:
                pos: self.pos
                size: self.size
                source: "images_bg/help_bg.jpg"

""")


class Entry(Screen):
    pass
    


class MultiAudio:
    _next = 0

    def __init__(self, filename, count):
        self.buf = [SoundLoader.load(filename)
                    for i in range(count)]

    def play(self):
        self.buf[self._next].play()
        self._next = (self._next   1) % len(self.buf)
    def stop(self):
        self.buf[self._next].stop()
        self._next = (self._next   1) % len(self.buf)

entry = MultiAudio('music/entry.wav', 5)
        
# Create the screen manager
sm = ScreenManager()
sm.add_widget(Entry(name='entry'))


class EntryApp(App):
    def build(self):
        EventLoop.ensure_window()
        return sm

    Window.clearcolor = get_color_from_hex('111110') #('111110')   


app = EntryApp()
if __name__ == '__main__':
    app.run()
  

Мой файл выглядит следующим образом:

тест: main.py музыкальные изображения_bg

Когда я использую этот первый код:

 Pyinstaller --onefile --onedir --windowed --icon=test.ico --noconsole --clean main.py
  

А затем я обновляю файл спецификации, добавляя данные и дерево в сбор, exe-файл работает.

main.spec:

 # -- mode: python ; coding: utf-8 --
from kivy.tools.packaging.pyinstaller_hooks import install_hooks
install_hooks(globals())
from kivy_deps import sdl2, glew
import kivy.core.audio
import kivy.core.image

block_cipher = None

a = Analysis(['main.py'],
pathex=['C:UsersacerDownloadstest'],
binaries=[],
datas=[('C:UsersacerDownloadstestimages_bg', 'images_bg'),
],
hiddenimports=[],
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,
[],
exclude_binaries=True,
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False , icon='test.ico')
coll = COLLECT(exe, Tree('C:UsersacerDownloadstest'),
a.binaries,
a.zipfiles,
a.datas,
strip=False,
*[Tree(p) for p in (sdl2.dep_bins   glew.dep_bins)],
upx=True,
upx_exclude=[],
name='main')
  

Qaund я пытаюсь создать один файл со следующим кодом:

 Pyinstaller --onefile --icon=test.ico main.py
  

А затем я обновляю файл спецификации:

 # -*- mode: python ; coding: utf-8 -*-
from kivy_deps import sdl2, glew
import kivy.core.audio 
import kivy.core.image 


block_cipher = None


a = Analysis(['main.py'],
             pathex=['C:UsersacerDownloadstest'],
             binaries=[],
             datas=[('C:UsersacerDownloadstestimages_bg', 'images_bg')],
             hiddenimports=[],
             hookspath=[],
             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=False , icon='test.ico')
  

Я получаю эту ошибку при запуске:

 [WARNING] [AudioSDL2   ] Unable to load music/entry.wav: b'Mix_LoadWAV_RW with NULL src'
[ERROR  ] [Image       ] Error reading file images_bg/help_bg.jpg
 Traceback (most recent call last):
   File "main.py", line 1642, in <module>
   File "kivyuixrelativelayout.py", line 265, in __init__
   File "kivyuixfloatlayout.py", line 65, in __init__
   File "kivyuixlayout.py", line 76, in __init__
   File "kivyuixwidget.py", line 361, in __init__
   File "kivyuixwidget.py", line 469, in apply_class_lang_rules
  

Комментарии:

1. Есть ли у вас путь к help_bg.jpg жестко запрограммированному в вашем приложении?

2. Да, путь жестко задан в приложении. Я добавил часть кода.

Ответ №1:

Ваша datas строка:

 datas=[('C:UsersacerDownloadstestimages_bg', '.'),
],
  

должно быть:

 datas=[('C:UsersacerDownloadstestimages_bg', 'images_bg'),
],
  

Это поместит изображения в папку, соответствующую вашему:

 source: "images_bg/help_bg.jpg"
  

Комментарии:

1. Решение работает с этой функцией этот код Pyinstaller —onefile —onedir —windowed —noconsole —clean main.py Но когда я пытаюсь получить один файл с этим кодом, появляется ошибка с пометкой fatal error Pyinstaller —onefile —windowed —noconsole —clean main.py Имея только один файл, мы не можем добавитьДерево (‘C: Users acer Downloads test ‘), потому что нет сбора

2. Обратите внимание, что любая из этих команд перезаписывает main.spec . Таким образом, все внесенные вами изменения main.spec будут потеряны. Обычно вы запускаете Pyinstaller [options] main.py один раз, затем редактируете main.spec . После этого вы запускаете Pyinstaller main.spec . Также обратите внимание, что при запуске с использованием файла действуют только определенные параметры командной строки spec . Смотрите документацию .

3. Я обновил свой вопрос. Чего я не понимаю, так это того, что когда мне нужен один файл, я получаю эту ошибку: [ПРЕДУПРЕЖДЕНИЕ] [AudioSDL2] Не удается загрузить music / entry.wav: b’mix_loadwav_rw с НУЛЕВЫМ src ‘ [ОШИБКА] [Изображение] Ошибка чтения файла images_bg / help_bg.jpg . У вас есть идея?

4. Вам ясно, что ваши изменения main.spec не будут иметь никакого эффекта, если вы не запустите Pyinstaller main.spec ? Кроме того, вам необходимо включить свои звуковые файлы аналогично тому, как вы включали изображения. Чтобы получить доступ к этим файлам, вам может потребоваться использовать методы, описанные в документации .

5. У меня вопрос: знаете ли вы, как я могу использовать относительный путь для файла Builder.load_string? но у меня есть эта ошибка i.stack.imgur.com/PoxZA.png