При преобразовании py в exe он не будет запускать файлы wav и png - PullRequest
0 голосов
/ 21 января 2019

Моя игра отлично работает из текстовых редакторов как py-файл, но когда я конвертирую его в исполняемый файл с использованием cx_Freeze и pyinstaller, я не могу запустить exe-файл, который он выводит, он выдает мне эту ошибку:

Traceback (most recent call last):
File "egg_rampage.py", line 12, in <module>
File "img_sound.py", line 7, in __init__
pygame.error: Unable to open file 'music/scream.wav'
[9292] Failed to execute script egg_rampage

Я перепробовал все, что нашел в интернете: -использование полного пути к файлам -использование init .py в конце файлов -установка exe через установочный файл - вывод аудиофайлов и файлов изображений на отдельный модуль

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

import pygame
import sys
import random
import time
from game_settings import Settings
from space_ship import SpaceShip
from img_sound import ImageSound


pygame.init()

imgs = ImageSound()

red = (255,0,0)
green = (0,255,0)
white = (255,255,255)
turquoise = (175,238,238)

crash_sound = imgs.scream
imgs.music

pygame.display.set_caption('Egg Rampage')
pygame.display.set_icon(imgs.caricon)
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.scr_width, 
ai_settings.scr_height))
ship = SpaceShip(screen, ai_settings)
screen_rect = screen.get_rect()

pause = False




def crash():
    pygame.mixer.music.stop()
    pygame.mixer.Sound.play(crash_sound)
    pygame.time.delay(600)
    exorcista_img = imgs.exorcista
    screen.blit(exorcista_img, [0,0])

    pygame.display.update()

    time.sleep(2)

    intro(ai_settings, screen)



def intro(ai_settings, screen):

    intro = True    
    while intro:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
        sys.exit()          

    intro_bg = imgs.intro_bg
    screen.blit(intro_bg, (0,0))                            


    button(screen, 170 , 200, 150, 50, ' PLAY', green, turquoise, "play")   
    button(screen, 170 , 270, 150, 50, ' QUIT', red, turquoise, "quit")

    highscore = load_highscores()
    button(screen, 170, 340, 150, 50, 'HIGHSCORE:' + str(highscore) , red, red) 
    pygame.display.update() 


def button(screen, x, y, w, h, text, a_color, i_color, action=None):

    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if x+w > mouse[0] > x and y+h > mouse[1] > y:
    pygame.draw.rect(screen, i_color, (x, y, w, h))
    if click[0] == 1 and action != None:
        if action == "quit":
        sys.exit()
    elif action == "play":
        run_game()
    elif action == "continue":
        unpause()
    else:
    pygame.draw.rect(screen, a_color, (x, y, w, h))

    font = pygame.font.Font('freesansbold.ttf' , 20)
    small_text2 = font.render(text, True, (255,255,255))
    small_text2_rect = small_text2.get_rect()   
    small_text2_rect.center = (x + (w/2), y + (h/2))    
    screen.blit(small_text2, small_text2_rect)


def egg(egg_startx, egg_starty):

    egg_img = imgs.egg_img
    for egg_x in egg_startx:
    screen.blit(egg_img, [egg_x, egg_starty])


def display_score(dodged):

    font = pygame.font.SysFont(None, 25)
    text = font.render("Your score: " + str(len(dodged)), True, white)
    screen.blit(text, (0,0))

    current_highscore = font.render("Highscore: " + str(load_highscores()), True , white)
    screen.blit(current_highscore, (0, 25))

    filename = 'highscores.txt'
    highscore = load_highscores()

    if len(dodged) > highscore :
        highscore = len(dodged)
        with open(filename, '+r') as f:
        f.write(str(len(dodged)))


def load_highscores():
    filename = 'highscores.txt'
    with open(filename, '+r') as f:
        try:
        highscore = int(f.read())
    except:
    highscore = 0   
    return highscore

def paused(ai_settings, screen):

    pygame.mixer.music.pause()

    while pause:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
        sys.exit()                                  

        font = pygame.font.Font('freesansbold.ttf', 50)
    text = font.render('PAUSED', True, (255,255,255))
    text_rect = text.get_rect(center = (ai_settings.scr_width/2, 100))
    screen.blit(text , text_rect)           

    button(screen, 170 , 200, 150, 50, ' CONTINUE', green, turquoise, "continue")   
    button(screen, 170 , 270, 150, 50, ' QUIT', red, turquoise, "quit")     
    pygame.display.update() 


def unpause():
    global pause
    pygame.mixer.music.unpause()
    pause = False



def run_game():
    global pause

    pygame.mixer.music.play(-1)


    ship = SpaceShip(screen, ai_settings)
    egg_startx = [random.randrange(0, ai_settings.scr_width)]
    egg_starty = -600
    egg_count = 1
    ai_settings.egg_speed = 3
    dodged = []

    y = 0
    x = 0
    x1 = 0 
    y1 = -500

    screen.blit(ai_settings.bg, ai_settings.bg.get_rect())

    while True: 

   for event in pygame.event.get():
       if event.type == pygame.QUIT:
        sys.exit()

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            ship.pressed_left = True
        elif event.key == pygame.K_RIGHT:
        ship.pressed_right = True
        elif event.key == pygame.K_p:
        pause = True
        paused(ai_settings, screen)

    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT:
        ship.pressed_left = False
        elif event.key == pygame.K_RIGHT:
        ship.pressed_right = False

    y1 += 2
    y += 2

    screen.blit(ai_settings.bg, (x,y))
    screen.blit(ai_settings.bg, (x1,y1))
    if y > 500:
        y = -500
    if y1 > 500:
    y1 = -500



        display_score(dodged)

    #crash against egg  
     egg(egg_startx, egg_starty)
         egg_center = float(egg_starty)
     egg_center += ai_settings.egg_speed
     egg_starty = egg_center

     if egg_starty > ai_settings.scr_height:
    egg_starty = -600
    egg_startx = []

         for x in range(egg_count):
             new_egg = random.randrange(0, ai_settings.scr_width - 75)
         egg_startx.append(new_egg)

             ai_settings.egg_speed += 0.1
         dodged.append(egg)

         if len(dodged) % 10 == 0:
             if egg_count < 3:
             egg_count += 1

     if ship.rect.y < egg_starty + 75 and ship.rect.y + 50 > egg_starty:
             for egg_x in egg_startx:
         if ship.rect.x < egg_x + 75 and ship.rect.x + 50 > egg_x:
             crash()

     #crash against screen edges        
      if ship.rect.left <= screen_rect.left or ship.rect.right >= screen_rect.right:
          crash()

     ship.blitme()  
     ship.update()                  

     pygame.display.update()

intro(ai_settings, screen)      
run_game()

А вот модуль, содержащий файлы:

import pygame

pygame.init()

class ImageSound():
    def __init__(self):
    self.scream = pygame.mixer.Sound("music/scream.wav")
    self.music = pygame.mixer.music.load("music/mario_kart_music.wav")
    self.caricon = pygame.image.load("images/caricon.png")
    self.exorcista = pygame.image.load("images/exorcista.bmp")
    self.intro_bg = pygame.image.load("images/intro_background.png")
    self.egg_img = pygame.image.load("images/egg.bmp")

И это установочный файл, который я использовал:

import cx_Freeze
import os
os.environ['TCL_LIBRARY'] = r"C:\Users\User\AppData\Local\Programs\Python\Python37\tcl\tcl8.6"
os.environ['TK_LIBRARY'] = r"C:\Users\User\AppData\Local\Programs\Python\Python37\tcl\tk8.6"

executables = [cx_Freeze.Executable("egg_rampage.py")]

cx_Freeze.setup(
name = "Egg Rampage",
options = {"build_exe": {"packages":["pygame"],
"include_files": 
[r"C:\Users\User\Desktop\egg_rampage\music\mario_kart_music.wav", 
r"C:\Users\User\Desktop\egg_rampage\music\scream.wav", 
r"C:\Users\User\Desktop\egg_rampage\images\background.png", 
r"C:\Users\User\Desktop\egg_rampage\images\caricon.png", 
r"C:\Users\User\Desktop\egg_rampage\images\egg.bmp", 
r"C:\Users\User\Desktop\egg_rampage\images\exorcista.bmp", 
r"C:\Users\User\Desktop\egg_rampage\images\intro_background.png", 
r"C:\Users\User\Desktop\egg_rampage\images\rocket.bmp", "highscores.txt"]} },
executables = executables
)

Надеюсь, вы сможете найти проблему, пожалуйста.

1 Ответ

0 голосов
/ 21 января 2019

из документации :

include_files: список, содержащий файлы для копирования в целевой каталог;

ожидается, что этот список будет содержать строкиили 2 кортежа для источника и назначения; ** источником может быть файл или каталог (в этом случае дерево копируется, за исключением каталогов .svn и CVS);цель не должна быть абсолютным путем

Полагаю, что передаваемые файлы копируются flat в целевой каталог, а не в подкаталог.

для включения папок music и images Я бы просто сделал:

cx_Freeze.setup(
name = "Egg Rampage",
options = {"build_exe": {"packages":["pygame"],
"include_files": 
[r"C:\Users\User\Desktop\egg_rampage\music",
r"C:\Users\User\Desktop\egg_rampage\images","highscores.txt"]} },
executables = executables
)

только для файлов, укажите целевой каталог

cx_Freeze.setup(
name = "Egg Rampage",
options = {"build_exe": {"packages":["pygame"],
"include_files": 
[(r"C:\Users\User\Desktop\egg_rampage\music\mario_kart_music.wav","music"),

и т. Д. С другими файлами (кортеж: оригинальный файл, относительный каталог назначения в пакете)

Кстати, программа все равно должна запускаться из основного пути сценария, так как ваш код использует относительные пути, это не будет работать.Что-то вроде:

MODULE_FILE = sys.executable if getattr(sys, 'frozen', False) else __file__  # to support both frozen and normal script
PROGRAM_DIR = os.path.abspath(os.path.dirname(MODULE_FILE))

затем:

image_file = os.path.join(PROGRAM_DIR,"image","mario.png")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...