При выполнении файла pyinstaller .exe pygame выдает ошибку

#python #tkinter #pygame #exe #pyinstaller

#python #tkinter #pygame #exe #pyinstaller

Вопрос:

Я создаю небольшую игру, используя в основном Tkinter, но для звуков я использовал pygame.

Я пытался создать файл .exe, но при выполнении выдает ошибку.

 pygame.init()

self.sound_player_shot = pygame.mixer.Sound('sounds/shot.wav')
self.sound_gameover = pygame.mixer.Sound('sounds/gameover.wav')

pygame.mixer.music.load('sounds/soundtrack.mp3')
pygame.mixer.music.play(-1)
  

Это единственные коды из pygame, которые я использую, и после создания файла .exe и копирования всех папок с данными в dist папку при выполнении возникает эта ошибка:

 Exception in Tkinter callback
Traceback (most recent call last):
  File "tkinter__init__.py", line 1883, in __call__
  File "space_shooter.py", line 1292, in start_game
  File "space_shooter.py", line 115, in __init__
pygame.error
  

sounds Папка находится в той же папке space_shooter.py , и все мои другие небольшие проекты работали, просто копируя все папки с данными в dist .

Спасибо!

Ответ №1:

Вы проверили, действительно ли путь, указанный вами для загрузки звуковых файлов, является тем путем, который вы собираетесь использовать? Одним из вариантов может быть print(path) и запустить exe из CMD, чтобы проверить его вручную.

Без более конкретного сообщения об ошибке и знания того, в какой строке на самом деле возникает ошибка, трудно дать более конкретный ответ.

Кроме того, я предлагаю вам использовать os модуль для получения и задания путей:

 import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'relative/path/to/file/you/want.mp3')
  

PS: возможно, вам стоит подумать о рефакторинге вашего «space_shooter.py «файл, 1292 строки в одном файле, на мой взгляд, звучит немного длинновато.

Ответ №2:

Включение данных с помощью программ, скомпилированных pyinstaller, может быть выполнено во время компиляции. Там вы можете связать путь к реальному файлу на вашем компьютере (относительный или абсолютный) с псевдонимом path, который вы используете в самой программе.

Документация довольно хорошо описывает этот процесс.