如何将pygame转换为exe?

Bil*_*ico 10 python pygame

最近,我做了一个pygame游戏。我想把它展示给我的朋友们。但不幸的是,我无法制作可执行文件,只能制作.py文件。我曾尝试使用py2exe可能不支持 Python 3.6 和pyinstaller. 我认为pyinstaller可能有用,我也可以成功制作一个exe文件,但它根本不起作用。它只是显示它无法打开已经在同一个文件中的声音文件。

我已经尝试了两种加载文件的方法,先加载路径,然后exe转换后显示无法打开与exe在同一路径下的文件。

其次,我使用os.pathexe显示无法打开的...../temp/...路径,这是一条很长的路径,但我的电脑根本没有这个文件夹。

我是一个学习python的新人。我已经搜索了一天,但无法使其工作。你能帮助我吗?

小智 19

我只是一个脚本黑客,在命令行工具方面是个白痴。但我真的很想将我的 python 游戏打包成一个 Windows 可执行文件。我与 pyinstaller 搏斗了好几天,并阅读了其他人的所有线程,他们也在试图弄清楚,我还多次阅读了所有 pyinstaller 文档。没有一个解决方案对我有用,但经过多次反复试验,我终于偶然发现了一个成功的秘诀,并想分享它,以防其他 pygame 开发人员对此提出异议。该解决方案包含几个线程的点点滴滴。

如何在 Windows 上使用 pyinstaller 创建具有多个资产目录的多文件 python pygame 的单个文件 exe:

首先,安装pyinstaller。

打开 Windows 命令提示符,输入:

pip install pyinstaller
Run Code Online (Sandbox Code Playgroud)

制作一个蟒蛇游戏。假设主游戏文件名为 main_game_script.py,位于

C:\Users\USERNAME\Documents\python\game_dir
Run Code Online (Sandbox Code Playgroud)

将此函数添加到 main_game_script.py。确保导入 os 和 sys。(我自己从来没有想过我需要将这个功能添加到我的游戏中,但它有效,所以感谢在其他线程中发布它的人)

import sys
import os

def resource_path(relative_path):
    try:
    # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)
Run Code Online (Sandbox Code Playgroud)

要将图像加载到游戏中,请调用该函数,如下所示:

asset_url = resource_path('assets/chars/hero.png')
hero_asset = pygame.image.load(asset_url)
Run Code Online (Sandbox Code Playgroud)

当您的游戏准备好打包在 EXE 中时,打开 Windows 命令提示符。转到主游戏目录并输入:

pyinstaller --onefile main_game_script.py
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

C:\Users\USERNAME\Documents\python\game_dir>pyinstaller --onefile main_game_script.py
Run Code Online (Sandbox Code Playgroud)

这将创建四个重要项目:

- a main_game_script.spec file in the game_dir
- a 'build' dir in the game_dir
- a 'dist' directory in the game_dir
- a main_game_script.exe will be created in the 'dist' directory.
Run Code Online (Sandbox Code Playgroud)

运行该命令会发出大量警告和日志。我不知道这一切意味着什么。但是只要最后的输出行显示成功,您就可能很好。你的 exe 还不能运行。首先,您必须修改 .spec 文件(现在存在于 game_dir 中)以将所需的游戏资产路径添加到 exe:

在记事本或其他任何地方打开 main_game_script.spec 文件。用这样的资产目录路径替换空的 datas[] 列表(使用元组!):

datas=[('assets/chars/*','assets/chars'),('assets/tiles/*.png','assets/tiles'),('assets/fonts/*','assets/fonts')],
Run Code Online (Sandbox Code Playgroud)

每个元组的第一个值是您要导入的实际文件名。第二个值是你的相对路径 main_game_script.py 语法和路径必须完美,否则将无法工作,也可能不会抛出错误

保存并关闭“main_game_script.spec”文件。返回到您的 Windows 命令提示符。类型:

pyinstaller main_game_script.spec
Run Code Online (Sandbox Code Playgroud)

像这样:

C:\Users\USERNAME\Documents\python\game_dir>pyinstaller main_game_script.spec
Run Code Online (Sandbox Code Playgroud)

这以某种方式将资产目录路径嵌入到您已经构建的 exe 中

完成这一切之后(在您完成 100 次后只需要几分钟),您终于拥有了一个包含所有游戏资产的 Python 游戏的单个 EXE 文件。如果一切顺利,请双击 EXE 来玩您的 Python 游戏。

注意:第一次把它做好花了我几天的时间。我从一个带有最少代码的简单 test_game_script.py 开始,并有条不紊地进行迭代,在每次迭代中添加更多资产路径和复杂性,以便我可以隔离出问题所在以及原因。如果您的游戏无法正确转换为 EXE,请从一个简单的 5 行游戏脚本开始,并在其上慢慢构建,直到您拥有一个可以工作的管道,然后将该功能正常的资产管道应用到您的实际游戏中。否则将无法隔离问题。