【问题标题】:How do I include assets on pyinstaller such as images and music如何在 pyinstaller 上包含资产,例如图像和音乐
【发布时间】:2020-10-19 18:27:57
【问题描述】:

我使用 pyinstaller 将我的文件设为 exe,但每次打开 exe 时都会出现错误提示 Failed to execute main script。我尝试了很多事情并询问了其他人,得出的结论是它没有识别资产。那么我如何获得它来识别资产,以便我可以运行 exe。

这是我的代码导入 pygame

import random
import math
import time

from pygame import mixer


pygame.init()
                                 #width, height
screen = pygame.display.set_mode((1000, 800))
background = pygame.image.load(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\back.png")

mixer.music.load(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\Song.mp3")
mixer.music.play(-1)

title = pygame.display.set_caption("Shoot Deannes")

icon = pygame.image.load(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\Deanne GYypsu python.png")
pygame.display.set_icon(icon)

lov = pygame.image.load(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\Lov.png")
show_image = False

playerImg = pygame.image.load(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\Python Player.png")
playerX = 450
playerY = 580
playerX_change = 0
playerY_change = 0

enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 5

for i in range(num_of_enemies):
    enemyImg.append(pygame.image.load(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\Pygame Enemy D.png"))
    enemyX.append(random.randint(0, 935))
    enemyY.append(random.randint(40, 140))
    enemyX_change.append(1.5)
    enemyY_change.append(random.uniform(0.3, 0.8))

bulletImg = pygame.image.load(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\Shoot.png")
bulletX = 0
bulletY = 0
bulletX_change = 0
bulletY_change = 7
bullet_state = "ready"

score_value = 0

font = pygame.font.Font("freesansbold.ttf", 32)
textX = 20
textY = 20

def show_score(x, y):
    score = font.render("Landed shots :" + str(score_value), True, (255, 192, 203))
    screen.blit(score, (x, y))

def player(x, y):
    screen.blit(playerImg, (x, y))

def enemy(x, y, i ):
    screen.blit(enemyImg[i], (x, y))

def fire_bullet(x, y):
    global bullet_state
    bullet_state = "fire"
    screen.blit(bulletImg, (x + 16, y + 10))  

def isCollision(enemyX, enemyY, bulletX, bulletY):
    distance = math.sqrt(math.pow(enemyX - bulletX,2)) + (math.pow(enemyY - bulletY,2))
    if distance < 50:
        return True
    else: 
        return False

def isCollision2(enemyX, enemyY, playerX, playerY):
    distance = math.sqrt(math.pow(enemyX - playerX,2)) + (math.pow(enemyY - playerY,2))
    if distance < 70:
        return True
    else: 
        return False             

running = True
while running:
    screen.fill((0,0,0))
    screen.blit(background, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_change = -3.5
            if event.key == pygame.K_RIGHT:
                playerX_change = 3.5      
            if event.key == pygame.K_SPACE:
                if bullet_state is "ready":
                    bullet_sound = mixer.Sound(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\ORG.wav")
                    bullet_sound.play()
                    bulletX = playerX 
                    bulletY = playerY
                    fire_bullet(bulletX, bulletY)         


        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0  
        

                
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                playerY_change = 2.5
            if event.key == pygame.K_UP:
                playerY_change = -2.5        
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_DOWN or event.key == pygame.K_UP:
                playerY_change = 0  
    
        
    playerX += playerX_change
    playerY += playerY_change
    if playerX <=0:
        playerX = 0
    elif playerX >=935:
        playerX = 935   

    for i in range(num_of_enemies):
        enemyX[i] += enemyX_change[i]
        enemyY[i] += enemyY_change[i]
        if enemyX[i] <=0:
            enemyX_change[i] = 1.5
            enemyY[i] += enemyY_change[i]
        elif enemyX[i] >=935:
            enemyX_change[i] = -1.5
            enemyY[i] += enemyY_change[i]
   
        collision = isCollision(enemyX[i], enemyY[i], bulletX, bulletY)
        if collision:
            bulletY = 580
            bullet_state = "ready"
            score_value += 1
            enemyX[i] = random.randint(0, 1000)
            enemyY[i] = random.randint(40, 140)   
        
        collision2 = isCollision2(enemyX[i], enemyY[i], playerX, playerY)
        if collision2:
            playerX = 4000
            playerY = 4000
            gameover_sound = mixer.Sound(r"C:\Users\35387\Documents\Python Coding\Shoot Deannes\GAME OVER.wav") 
            gameover_sound.play()
            show_image = True

        if show_image:
            pygame.display.set_mode((480, 910)).blit(lov, (0, 0))
       

        enemy(enemyX[i], enemyY[i], i)                  

    if bulletY <=0 :
        bulletY =580
        bullet_state = "ready"

    if bullet_state is "fire":
        fire_bullet(bulletX, bulletY)    
        bulletY -= bulletY_change


    player(playerX, playerY)
    show_score(textX, textY)
    pygame.display.update()

这也是我第一次做这种事情,所以请不要介意我的愚蠢。我将所有资产和这个名为 main.py 的文件放在同一个文件夹中,但我无法成功地将其转换为 exe。

【问题讨论】:

  • 听起来问题在于您处理资源路径的方式以及加载它们的方式。查看this answer 以获得一些解释。

标签: python cmd pygame pyinstaller


【解决方案1】:

将资产与可执行文件放在同一文件夹中。 (或者,如果它希望将资产放在子文件夹中,请将它们放在那里)

【讨论】:

  • @Jeromus 你的代码和文件夹结构将有助于了解然后
  • 好的,你需要我的完整代码吗,但无论如何,在我的文件夹中有一些 pgns、一个 wav 文件和一个 mp3。 `
  • @Jeromus 是的,您的代码以及可执行文件所在文件夹的设置方式都会有所帮助
  • 好吧,我把代码放进去,你的意思是exe在dist文件夹中
  • @Jeromus 我的意思是与可执行文件的位置相比,您放置资产的位置
猜你喜欢
  • 2015-10-28
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多