Python Kivy应用程序在Pyinstaller启动时崩溃
我将kivy 1.11.1与python 3.7.6 windows 10和Pyinstall 4.0结合使用。我的应用程序运行得很好,当我安装pyinstall时,一切都正常运行。但是当我启动文件时,exe会在启动时启动崩溃应用程序 守则的一部分:Python Kivy应用程序在Pyinstaller启动时崩溃,python,kivy,pyinstaller,Python,Kivy,Pyinstaller,我将kivy 1.11.1与python 3.7.6 windows 10和Pyinstall 4.0结合使用。我的应用程序运行得很好,当我安装pyinstall时,一切都正常运行。但是当我启动文件时,exe会在启动时启动崩溃应用程序 守则的一部分: from kivy.app import App from kivy.base import EventLoop from kivy.core.audio import SoundLoader from kivy.utils import ge
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()
然后我更新spec文件,在Collect中添加数据和树,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:\Users\acer\Downloads\test'],
binaries=[],
datas=[('C:\Users\acer\Downloads\test\images_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:\Users\acer\Downloads\test\'),
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:\Users\acer\Downloads\test'],
binaries=[],
datas=[('C:\Users\acer\Downloads\test\images_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 "kivy\uix\relativelayout.py", line 265, in __init__
File "kivy\uix\floatlayout.py", line 65, in __init__
File "kivy\uix\layout.py", line 76, in __init__
File "kivy\uix\widget.py", line 361, in __init__
File "kivy\uix\widget.py", line 469, in apply_class_lang_rules
[WARNING][AudioSDL2]无法加载音乐/entry.wav:b'Mix_LoadWAV_RW with NULL src'
[错误][图像]读取文件图像时出错\u bg/help\u bg.jpg
回溯(最近一次呼叫最后一次):
文件“main.py”,第1642行,在
文件“kivy\uix\relativelayout.py”,第265行,在_init中__
文件“kivy\uix\floatlayout.py”,第65行,在__
文件“kivy\uix\layout.py”,第76行,在__
文件“kivy\uix\widget.py”,第361行,在__
文件“kivy\uix\widget.py”,第469行,在apply\u class\u lang\u规则中
您的数据
行:
datas=[('C:\Users\acer\Downloads\test\images_bg', '.'),
],
应该是:
datas=[('C:\Users\acer\Downloads\test\images_bg', 'images_bg'),
],
这将把图像放在与您的:
source: "images_bg/help_bg.jpg"
你的应用程序中是否有硬编码的
help\u bg.jpg
路径?是的,该路径在应用程序中是硬编码的。我添加了部分代码。解决方案使用此函数此代码Pyinstaller--onefile--onedir--windowed--noconsole--clean main.py但当我尝试使用此代码获取单个文件时,出现了一个错误,它被标记为致命错误Pyinstaller--onefile--windowed--noconsole--clean main.py,只有一个文件,我们无法添加树('C:\Users\acer\Downloads\test\'),因为没有收集器。请注意,这些命令中的任何一个都会覆盖main.spec
。因此,您对main.spec
所做的任何更改都会丢失。通常,您会运行Pyinstaller[选项]main.py
一次,然后编辑main.spec
。然后运行Pyinstaller main.spec
。还要注意,当您使用spec
文件运行时,只有某些命令行选项有效。请参阅。我更新了我的问题。我不明白的是,当我想要一个文件时,会出现以下错误:[WARNING][AudioSDL2]无法加载music/entry.wav:b'Mix_LoadWAV_RW with NULL src'[错误][图像]读取文件images\u bg/help\u bg.jpg时出错。您有什么想法吗?您是否清楚,除非运行Pyinstaller main.spec
,否则对main.spec
所做的更改将无效?此外,您需要以与图像类似的方式包含声音文件。要访问这些文件,您可能需要使用。我有一个问题:您知道如何使用Builder.load_字符串文件的相对路径吗?但我有这个错误
source: "images_bg/help_bg.jpg"