Включение звуковых файлов в скрипт pygame с использованием pyinstaller

Я новичок в программировании, поэтому я решил создать Понг, и я это сделал. Теперь я хочу поделиться им с парой друзей, поэтому я решил попробовать использовать pyinstaller (попробовал cx_Freeze). В этой игре понг у меня есть 3 звуковых эффекта, расположенных в папке "sfx". Итак, я рассмотрел включение файлов с помощью pyinstaller, поэтому мой файл.spec говорит:

added_files = [
        ('E:\Game Development Stuff\Python 3\Games\Pong\sfx\hitOutline.ogg', 'sfx'),
        ('E:\Game Development Stuff\Python 3\Games\Pong\sfx\hitPaddle.ogg', 'sfx'),
        ('E:\Game Development Stuff\Python 3\Games\Pong\sfx/score.ogg', 'sfx')
        ]

a = Analysis(['pong.py'],
         pathex=['E:\\Game Development Stuff\\Python 3\\Games\\Pong'],
         binaries=None,
         datas=added_files,

и в самой программе Pong я использую этот код, чтобы получить путь:

def resource_path(relative):
    if hasattr(sys, "_MEIPASS"):
        return os.path.join(sys._MEIPASS, relative)
    return os.path.join(relative)

fileDir = os.path.dirname(os.path.realpath('__file__'))


hitPaddle = resource_path(os.path.join(fileDir, "sfx", "hitPaddle.ogg"))
hitOutline = resource_path(os.path.join(fileDir, "sfx", "hitOutline.ogg"))
score = resource_path(os.path.join(fileDir, "sfx", "score.ogg"))

hitPaddleSound=pygame.mixer.Sound(hitPaddle)
hitOutlineSound=pygame.mixer.Sound(hitOutline)
scoreSound=pygame.mixer.Sound(score)

Поэтому я делаю exe-файл с помощью pyinstaller (с помощью команды pyinstaller pong.spec), но когда я открываю файл pong.exe, командное окно говорит:

Traceback "<string>", Unable to open file 'E:\\Game Development Stuff\\Python 3\\Games\\Pong\\dist\\pong\\sfx\\hitPaddle.ogg'

но по тому же пути находится hitPaddle.ogg Мне кажется, что Pygame не может найти его по какой-то странной причине?

Спасибо Сисома Гмо Мунден

1 ответ

Я считаю, что проблема заключается в этой линии. Вы неправильно ссылаетесь на файлы. Вы написали:

hitPaddle = resource_path(os.path.join(fileDir, "sfx", "hitPaddle.ogg"))

Вместо этого вы должны просто:

hitpaddle = resource_path("sfx\hitPaddle.ogg")

Это потому, что когда вы добавили файлы в файл спецификации, вы заявили, что они должны находиться в папке "root \ sfx". Когда.exe запускается в режиме одного файла, все файлы фактически находятся во временной папке MEIXXXX, где XXXX - это целые числа. Когда вы запустите.exe, если вы откроете эту папку, вы сможете увидеть ваши файлы там.

Решил это для меня после того, как часами боролся с одной и той же проблемой. Выводы:

Проблема не в том, что он не может найти его, тогда он скажет что-то с "не удалось найти". Это действительно проблема с открытием файла. Почему-то формат.ogg вызывает проблемы. Я изменил все мои файлы.ogg на файлы.wav, и моя игра теперь работает без проблем как исполняемый файл.

Я понятия не имею, почему, потому что две недели назад для предыдущей версии мне удалось создать рабочий.exe с точно такими же файлами.ogg. И я не понимаю, как внесенные мной изменения повлияют на это. Во всяком случае, сейчас это работает, и, возможно, это также может решить эту проблему для других.

Другие вопросы по тегам