Iexpress:pygame.error:文件不是 Windows BMP 文件

Posted

技术标签:

【中文标题】Iexpress:pygame.error:文件不是 Windows BMP 文件【英文标题】:Iexpress: pygame.error: File is not a Windows BMP file 【发布时间】:2015-02-16 09:38:57 【问题描述】:

这是我在这里的第一篇文章。我看到很多类似的问题,但我的问题有点具体。要进入主题,我需要使用 python 使单个文件可执行,就像我使用 py2exe 和 Iexpress 所做的那样。一切都很完美,直到我昨天添加了图片(.png)。用 py2exe 编译后一切正常,所以我很确定 pygame 能够打开 .png 但是当我用 Iexpress 压缩时,它应该只是将它们解压缩到临时文件夹中,我得到:

"Traceback(最近一次调用最后一次): 文件“Game.py”,第 23 行,在 pygame.error: 文件不是 Windows BMP 文件"

所以我得到了 2 个完全相同的文件夹,第一个 pre-iexpress 有效,第二个 temp 文件夹无效。 我使用 Python 3.4 和 pygame‑1.9.2a0‑cp34 这是我的代码

__author__ = 'Xpd'
        back = "bg.png"
        sh = "ship.png"
        ali = "alien.png"
        import pygame
        import random
        import sys
        pygame.init()
        white = (255,255,255)
        black = (0,0,0)
        red = (255,0,0)
        green =(0,255,0)
        blue = (0,0,255)
        display_width = 800
        display_height = 600



        clock = pygame.time.Clock()

        gameDisplay = pygame.display.set_mode((display_width,display_height), 0, 0)
        pygame.display.set_caption('Invaders')
        background = pygame.image.load(back)
        ship = pygame.image.load(sh)
        alien = pygame.image.load(ali)
        def Intro():
            Intro = True
            while Intro == True:
                gameDisplay.fill(green)
                pygame.display.update()
                for event in pygame.event.get():
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_UP:
                            Intro = False
                    if event.type == pygame.QUIT:
                            pygame.quit()
                            sys.exit()
        def text_to_button(msg, color, buttonx, buttony, buttonwidth, buttonheight, size = "small"):
            textSurf, textRect = text_objects(msg,color,size)
            textRect.center = ((buttonx+(buttonwidth/2)), buttony+(buttonheight/2))
            gameDisplay.blit(textSurf, textRect)

            return textSurface, textSurface.get_rect()



        def text(msg,color, y_displace=0, size = "small"):
            textSurf, textRect = text_objects(msg,color, size)
            textRect.center = (display_width / 2), (display_height / 2)+y_displace
            gameDisplay.blit(textSurf, textRect)

        def GameLoop():
            gameExit = False
            gameOver = False
            prime_x = display_width/2
            block = 3
            fps=300
            alien_x = random.randrange(50,300)
            alien_y = random.randrange(50,300)
            alien_health = 1
            ship_health = 3
            ship_damage = 1


            bulletspeed = 0
            bullet_y = 550
            bullet_x = -50
            bullet_size = 5
            movement = 0


            while gameOver == True:
                for event in pygame.event.get():
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_q:
                            gameExit = True
                        if event.key == pygame.K_c:
                            GameLoop()


            while not gameExit:
                if prime_x <= 0:
                            prime_x = 0
                if prime_x >= 790:
                            prime_x = 790
                for event in pygame.event.get():
                    print(event)
                    if event.type == pygame.QUIT:
                         gameExit = True
                         gameQuit = True
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_LEFT:
                            movement = -block
                        if event.key == pygame.K_RIGHT:
                            movement = block
                        if event.key == pygame.K_SPACE:
                            if bullet_y < 0:
                                    bullet_y = 550
                            if bullet_y == 550:
                                bulletspeed = -bullet_size
                                bullet_x = prime_x
                                if bullet_y < 0:
                                    bullet_y = 550




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

                if alien_x < bullet_x < alien_x + 50 or alien_x < bullet_size + bullet_x < alien_x + 50:
                        if alien_y < bullet_y < alien_y + 50 or alien_y < bullet_size + bullet_y < alien_y + 50:
                            alien_health -= ship_damage
                            bulletspeed = 0
                            bullet_y = 550
                            bullet_x = -50
                            if alien_health <= 0:
                                alien_x = random.randrange(50,300)
                                alien_y = random.randrange(50,300)
                                alien_health = 1


                prime_x += movement
                bullet_y += bulletspeed
                pygame.draw.rect(gameDisplay, green,[alien_x,alien_y,50 ,50 ] )
                gameDisplay.blit(background, (0,0))
                gameDisplay.blit(alien, (alien_x,alien_y))

                gameDisplay.blit(ship, (prime_x-22,545))

                pygame.draw.rect(gameDisplay, red, [bullet_x, bullet_y,bullet_size, bullet_size])
                pygame.display.update()
                clock.tick(fps)


        Intro()
        GameLoop()
        pygame.quit()
        sys.exit()

我在 Iexpress 中放置了: Alien.png、bg.png、Game.exe、SDL.dll、SDL_IM~1.dll、SDL_MI~1、SDL_ttf.dll、ship.png、smpeg.dll

抱歉,如果我在这里做错了什么,这是我的第一个项目。

编辑:pygame.image.get_extended() 返回 1,使用 Windows 8.1 测试 Iexpress 32 位和 64 位仍然无法正常工作。

【问题讨论】:

【参考方案1】:

我无法发表评论,所以这里有一个“答案”... 你蟒蛇看起来不错。我认为 IExpress 很棒,但排除故障可能有点棘手。以下是我会尝试的事情:

    最简单的方法 - 检查以确保文件不为空并且已正确提取(文件大小、名称和其他属性)。该文件未被其他进程打开(IExpress 未暂停提取等)。 IExpress压缩时查看日志文件 检查您的 IExpress 配置文件中是否有 UseLongFileName=1 (*.sed) 检查以确保所有内容都在提取属性 更改您的 IExpress 配置文件以具有以下设置 ShowInstallProgramWindow=3 HideExtractAnimation=0 AppLaunched=cmd /C "echo begin&&pause&&echo end" 注意:确保您有 ShowInstallProgramWindow=3,这样您就需要一个隐藏进程等待用户输入 - 锁定资源。 #4 的变体,更改安装命令以在退出前将临时文件夹复制到其他位置。 AppLaunched=cmd /C "copy * C:\some\folder\&&pause" 无聊的一个。创建一个 pythong 脚本来读取两个 BMP 文件并逐字节检查是否存在差异,类似于以下内容... import os org = open('original.bmp','rb') new = open('new.bmp','rb') size_compared = 0 comp_size = 1 MAX_SIZE = max(os.path.getsize(i) for i in ('original.bmp','new.bmp')) print 'comparing bytes...' while True: a = org.read[comp_size] b = new.read[comp_size] size_compared += comp_size if a!=b: print 'bytes don't match!' print ' != '.format(a,b) print 'at byte '.format(size_compared) break if a=='' and b=='': break # files are empty if MAX_SIZE < size_compared: break # just in case... shouldn't happen... org.close() new.close() print 'done comparing... anything found?'

如果您有任何问题,请尽管提问 - 尽情享受吧。

【讨论】:

以上是关于Iexpress:pygame.error:文件不是 Windows BMP 文件的主要内容,如果未能解决你的问题,请参考以下文章

Pygame:pygame.error:无法打开文件.ogg

安装所有文件后如何运行批处理文件(IExpress)

iexpress 提取文件,然后从 exe 中运行 vbs 引用文件

IExpress 2 和 bat 文件路径

快递。如何将文件夹设置为 iexpress SED 格式的数据源?

Iexpress - 提取路径