Компилция игры pygame c звуками и изображениями

Рейтинг: 2Ответов: 2Опубликовано: 22.08.2023

Как мне скомпилировать игру pygame, которая содержит звуки и изображения? Вся загвоздка в том, что мне нужно собрать игру в один exe-файл, а не архив с нужными для игры файлами. При попытке запуска скомпилированной программы (pyinstaller game.py --onefile --noconsole) программа создаёт окно с ошибкой:

Traceback (most recent call last):
  File "SmileyPong2.py", line 20, in <module>
FileNotFoundError: No file 'sprites\Smiles\defaultsmile.bmp' found in working directory 'D:\IceWork\SmileyPong2\dist'.

Загрузка изображений и звуков:

    # Изображения
    smile_pic = pg.image.load(r"sprites\Smiles\defaultsmile.bmp", "defaultsmile.bmp")
    rocket_pic = pg.image.load(r"sprites\Rockets\defaultrock.png", "defaultrock.png")
    heart_pic = pg.image.load(r"sprites\Bonuces\heart.png", "heart.png")
    cursor_pic = pg.image.load(r"icons\Cursor.png")
    # Звуки
    pg.mixer.music.load(r"sounds\gametheme.ogg", "gametheme.ogg")
    rebound_snd = pg.mixer.Sound(r"sounds\Rebound.ogg")
    end_snd = pg.mixer.Sound(r"sounds\EndLevel.ogg")
    dmg_snd = pg.mixer.Sound(r"sounds\damage.ogg")

Ответы

▲ 0

Здесь 2 варианта как решить проблему.

Первый - вы запустили pyinstaller не из той папки. Попробуйте запустить его в папке, которая старше папки sprites\Smiles\defaultsmile.bmp.

Можете также открыть консоль в этой папке и выполнить скрипт с таким кодом:

import PyInstaller.__main__

PyInstaller.__main__.run([
    'SmileyPong2.py',
    '--onefile',
    '--noconsole'
])

если у вас установлена библиотека вообще в интерпретаторе Python.

Второй - поместить все файлы игры в одну папку (без подпапок) и поменять в коде их упоминания. Затем запустить pyinstaller в этой папке (не забудьте положить туда и скрипт).

В идеале воспользоваться первым вариантом, потому что это проще, удобнее и правильнее с точки зрения организации проекта.

▲ 0
  1. Запускать сборку с параметром --add-data, например:
pyinstaller --add-data "fonts/*.ttf;fonts" --add-data "images/*.png;images" --add-data "sounds/*.mp3;sounds" game.py --onefile
  1. При указании пути к ресурсу в программе делать проверку, как был запущен скрипт, из .py файла или из собранного exe файла. Например, можно использовать такую функцию:
from pathlib import Path, PurePath
import sys


def resource_path(relative_path):
   if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
       bundle_dir = Path(sys._MEIPASS)
   else:
       bundle_dir = Path(__file__).parent

   return PurePath(bundle_dir, relative_path)

print(resource_path(relative_path=r'fonts\SomeFont.ttf'))