簡體   English   中英

如何將 pygame 轉換為 exe?

[英]How can I convert pygame to exe?

最近做了一個pygame的游戲。 我想把它展示給我的朋友們。 但不幸的是,我無法制作可執行文件,只能制作.py文件。 我嘗試使用可能不支持 Python 3.6 和pyinstallerpy2exe等工具。 我覺得pyinstaller可能有用,我也可以成功制作一個exe但是根本就不行。 它只是顯示它無法打開已經在同一個文件中的聲音文件。

我嘗試了兩種加載文件的方法,首先加載路徑然后轉換后的exe顯示它無法打開已經與exe位於同一路徑的文件。

其次,我使用了 exe 顯示它無法打開的os.path ...../temp/...這是一條很長的路徑,但我的電腦根本沒有這個文件夾。

我是新人學習python,找了一天都搞不定。 你能幫助我嗎?

我只是一個腳本黑客,在命令行工具方面是個白痴。 但我真的很想將我的 python 游戲打包成一個 Windows 可執行文件。 我與 pyinstaller 搏斗了好幾天,並閱讀了其他人也試圖弄清楚的所有線程,我還多次閱讀了所有 pyinstaller 文檔。 沒有一種解決方案對我有用,但經過多次試驗和錯誤,我終於偶然發現了成功的秘訣,並想分享它,以防萬一還有其他 pygame 開發人員對此表示反對。 該解決方案包含幾個線程的點點滴滴。

如何在 Windows 上使用 pyinstaller 創建具有多個資產目錄的多文件 python pygame 的單個文件 exe:

首先,安裝 pyinstaller。

打開 Windows 命令提示符,鍵入:

pip install pyinstaller

做一個python游戲。 假設主游戲文件名為 main_game_script.py,位於

C:\Users\USERNAME\Documents\python\game_dir

將此函數添加到 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)

要將圖像加載到游戲中,請調用該函數,如下所示:

asset_url = resource_path('assets/chars/hero.png')
hero_asset = pygame.image.load(asset_url)

當您的游戲准備好打包到 EXE 中時,打開 Windows 命令提示符。 轉到主游戲目錄並輸入:

pyinstaller --onefile main_game_script.py

它看起來像這樣:

C:\Users\USERNAME\Documents\python\game_dir>pyinstaller --onefile main_game_script.py

這將創建四個重要項目:

- 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.

運行該命令會產生大量警告和日志。 我不知道這一切意味着什么。 但只要最終輸出行顯示成功,您可能就很好。 您的 exe 將無法運行。 首先,您必須修改 .spec 文件(現在存在於 game_dir 中)以將所需的游戲資源路徑添加到 exe:

在記事本或其他任何東西中打開 main_game_script.spec 文件。 用像這樣的資產目錄路徑替換空的 datas[] 列表(使用元組!):

datas=[('assets/chars/*','assets/chars'),('assets/tiles/*.png','assets/tiles'),('assets/fonts/*','assets/fonts')],

每個元組的第一個值是您要導入的實際文件名。 第二個值是你的相對路徑 main_game_script.py 語法和路徑必須是完美的,否則它將不起作用並且可能不會拋出錯誤

保存並關閉“main_game_script.spec”文件。 返回到您的 Windows 命令提示符。 類型:

pyinstaller main_game_script.spec

像這樣:

C:\Users\USERNAME\Documents\python\game_dir>pyinstaller main_game_script.spec

這以某種方式將資產目錄路徑嵌入到您已經構建的 exe 中

經過這一切(完成 100 次后只需幾分鍾),您終於有了一個包含所有游戲資產的 Python 游戲的單個文件 EXE。 如果你做的一切都正確,雙擊 EXE 來玩你的 python 游戲。

注意:第一次做對花了我幾天時間。 我從一個簡單的 test_game_script.py 開始,使用最少的代碼並有條不紊地進行迭代,在每次迭代中添加更多的資產路徑和復雜性,這樣我就可以找出損壞的原因和原因。 如果您的游戲沒有正確轉換為 EXE,請從一個包含一個資產的簡單 5 行游戲腳本開始,然后在其上慢慢構建,直到您有一個可以工作的管道,然后將該有效的資產管道應用到您的 ACTUAL 游戲中。 否則將無法隔離問題。

1. 添加--hidden-import pygame 就像是:
python -m PyInstaller <options> xxx.py --hidden-import pygame
2. 破解 pygame 標准輸出。 如果您使用選項-w ,它將因為 pygame 的(煩人的)版本輸出而失敗。
解決方法:

import contextlib
with contextlib.redirect_stdout(None):
    import pygame

我也遇到了同樣的問題,花了幾天時間瀏覽谷歌。 今天終於意識到問題出在哪里。 在嘗試轉換之前,請記得通過終端安裝 Pygame。 只需輸入“pip install pygame”

上面的@Blue Botic 答案就像一個魅力! 謝謝!

我在下面的命令中添加了“--noconsole”參數來擺脫控制台,只顯示游戲的主窗口:

pyinstaller --onefile --noconsole main_game_script.py

這可以通過 cx_freeze 來完成

pip install cx_freeze

您需要創建一個 setup.py 文件來幫助 cx_freeze 構建可執行文件

import cx_Freeze

# base = "Win32GUI" allows your application to open without a console window
executables = [cx_Freeze.Executable('my_example_app.py', base = "Win32GUI")]

cx_Freeze.setup(
    name = "My Example Exe App",
    options = {"build_exe" : 
        {"packages" : ["pygame"], "include_files" : ['example_folder_with_files/', 'ExampleFont.ttf', 'example_text_file.txt']}},
    executables = executables
)

請務必將您的包、字體或文件添加到腳本中,並將您的應用程序需要的任何其他文件添加到設置中。

最后你需要運行你的 setup.py 腳本

python setup.py build

或者如果您希望 cx_freeze 為您創建安裝程序

python setup.py bdist_msi

Sentdex 在他的網站pythonprogramming.net上有一個很好的演練

使用 PyInstaller 可以不編輯 .spech 文件,使用參數 --collect-data NAME_ASSET_FOLDER

pyinstaller main_game_script.py --onefile --windowed --collect-data assets/chars --collect-data assets/tiles --collect-data assets/fonts 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM