Pygame.image.load()不使用PyInstaller

时间:2016-04-18 17:38:28

标签: python python-3.x pygame

img_l = pygame.image.load("img.png")
screen.blit(img_l)

使用Python Interpreter,它工作得很好,图像加载和main.py运行没有问题,但是当我使用Pyinstaller将它变成一个文件.exe时,.exe崩溃。

我尝试了很少.spec次修改,但很少有人能找到帮助。

任何想法都真诚地感激。

编辑:让它与之合作:

img_l = pygame.image.load(os.path.join('img.png'))
screen.blit(img_l, (0, 0))

现在它通过PyInstaller后可以正常工作:)

4 个答案:

答案 0 :(得分:1)

抱歉,我对编程非常陌生。 我尝试运行.exe时遇到类似(相同的?)错误 它说:

pygame.error: Couldn't open walkr1.png

我尝试了您使用的修复,但后来出现了错误:

pygame.error: Can't seek in this data source

图像文件位于包含主.py文件的文件夹中的文件夹中。我已经尝试将文件移动到同一个文件夹但是没有用。我还尝试将数据文件添加到.spec文件中,但这似乎不起作用...... 想知道你是否可以提供帮助? 对不起,我知道这些可能都是非常愚蠢的问题。

答案 1 :(得分:1)

对于遇到同样问题且尝试过@ Esa的答案的其他人,您可能会注意到在目录外运行时有时无效。这是由Pyinstaller仍然试图找到相对路径而不是使用包含的文件引起的。这可以通过在加载文件之前在代码中找到正确的路径来解决:

pygame.image.load(os.path.join(Path, 'Path\\to_file\\from_root'))

这可以找到文件的实际路径,并且必须为每个文件完成,例如:

sys._MEIPASS

datas是关键,因为它会在程序冻结时找到路径,就像程序被冻结一样,它的文件存储在其他地方。

生成.exe文件时,还会使用根目录创建.spec文件。在那里,你需要编辑如下:

  1. 您应该看到类似于下面的文件结构
  2. 请注意None如何等于# -*- mode: python -*- block_cipher = None #you will have to add things here later a = Analysis(['file.py'], pathex=['C:\\path\\to\\root\\folder'], binaries=None, datas=None, hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, exclude_binaries=True, name='game_file', debug=False, strip=False, upx=True, console=True , icon='icon_file.ico') 。你必须编辑它。
  3. 这是目前根目录中的.spec文件:

    added_files

    现在我们要做的就是添加所有文件:将此block_cipher放在Analysis()下面added_files = [ ('file1.png', '.') #The '.' represents root folder ('file2.png', '\\folder') #loads file2.png from root\folder ] 以上,例如:

    Analysis()

    现在在None内,我们将datas后的added_files更改为pyinstaller "PY_FILE_NAME.spec" 。您还会注意到最终文件有不同的主要选项。你可以在这里编辑这些,但你不能改变" onefile"选项,这是在创建.spec文件时生成的。

    最后要制作这个新的exe文件,请转到cmd中的根文件夹并输入:

    {{1}}

    最终的exe,无论是否在文件夹中都应该在root \ dist \ Executable_name.exe或root \ dist \ Executable_name \ Executable_name.exe

答案 2 :(得分:0)

让它合作:

img_l = pygame.image.load(os.path.join('img.png'))
screen.blit(img_l, (0, 0))

现在它通过PyInstaller后可以正常工作:)

答案 3 :(得分:0)

我遇到了同样的问题。由于某种原因,未为--onefile打包的可执行文件正确设置工作目录。我设法在程序开始时使用以下代码来解决它。 这类似于上面提出的解决方案,但我发现它稍微更优雅:) 如果我们以单个可执行文件的身份运行,它基本上会将工作目录强制到临时提取的目录。

import sys
import os
if getattr(sys, 'frozen', False):
    os.chdir(sys._MEIPASS)