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

Я новичок в программировании, поэтому я поставил перед собой задачу создать Pong, что я и сделал. Теперь я хочу поделиться им с парой друзей, поэтому я решил попробовать использовать pyinstaller (пробовал cx_Freeze). В этой игре Pong у меня есть 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 не может его найти по какой-то странной причине?


person Sisoma Munden    schedule 09.05.2016    source источник


Ответы (2)


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

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

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

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

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

person Mark Cuddihy    schedule 25.05.2016
comment
Эй, спасибо за ваш ответ! К сожалению, я не смог решить проблему с помощью вашего решения. У меня точно такая же ошибка - person Sisoma Munden; 28.05.2016

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

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

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

person GForce    schedule 26.12.2019