Включение звуковых файлов в скрипт 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. И я не понимаю, как внесенные мной изменения повлияют на это. Во всяком случае, сейчас это работает, и, возможно, это также может решить эту проблему для других.