
[code]

    import pygame
    from pygame.locals import*
    import sys
    
    def main():
        (w,h)=(400,400)
        (x,y)=(200,200)
        pygame.init()
        screen=pygame.display.set_mode((w,h),0,32)
        screen=pygame.display.get_surface()
        pygame.display.set_caption("Pygame Test")
    
        bg= pygame.image.load("C:\prog\python\pygame\bg.png").convert_alpha
        rect_bg=bg.get_rect()
    
        player=pygame.image.load("C:\prog\python\pygame\player.png").convert_alpha
        rect_player=player.get_rect()
        rect_player.center=(x,y)
    
        while(1):
            pygame.display.update()
            pygame.time.wait(30)
            screen.fill((0,20,0,0))
            screen.blit(bg,rect_bg)
            screen.blit(player,rect_player)
    
            for event in pygame.event.get():
                if event.type==QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type==KEYDOWN:
                    if event.key==K_ESCAPE:
                        pygame.quit()
                        sys.exit()
    
    main()
    
[/code]

と入力すると

[code]

        11     pygame.display.set_caption("Pygame Test")
         12 
    ---> 13     bg= pygame.image.load("C:\prog\python\pygame\bg.png").convert_alpha
         14     rect_bg=bg.get_rect()
         15 
    
    error: Couldn't open C:\prog\python\pygamg.png
    
[/code]

というエラーが発生して、bg.pngが開けませんでした。画像のファイルはこのコードが入っているファイルと一緒の場所にあるのになぜ開けないのでしょうか？


CC BY-SA 4.0
2020-04-20T16:59:05.770
65797
2020-04-21T02:22:52.713
39563
question
python 画像
pygame 画像を読み込めない


原因はパスの区切りをバックスラッシュ`\`
1つだけにしていることと、ファイル名の最初の文字が`b`で`\b`となってバックスペースのエスケープシーケンスが成立してしまったことにあるでしょう。

エラーメッセージに`error: Couldn't open
C:\prog\python\pygamg.png`とあって、ソースのファイル名`"C:\prog\python\pygame\bg.png"`からバックスペース(直前の1文字削除)処理によって`e\b`が削除されています。  
`\p`はエスケープシーケンスでは無いのでそのままになっています。

こちらにエスケープシーケンス等を含む文字列リテラルの仕様があります。  
[2.4.1.
文字列およびバイト列リテラル](https://docs.python.org/ja/3.6/reference/lexical_analysis.html#string-
and-bytes-literals)

対策は以下のいずれかですね。

  * パスの区切りを`\`バックスラッシュではなく`/`スラッシュに変える
  * バックスラッシュのままにするのなら以下のいずれか 
    * バックスラッシュを連続させて`\\`というように2つにする
    * `r"..."`というように文字列のダブルクォーテーションの前に`r`または`R`を付ける

エスケープシーケンスになってしまう文字の前のバックスラッシュだけ2つにするという手もありますが、何が対象かを覚えておかなくてはいけないし、パスを書くたびに考慮しなければならないので煩雑になります。


CC BY-SA 4.0
2020-04-20T17:07:21.153
65800
2020-04-21T02:22:52.713
2020-04-21T02:22:52.713
26370
26370
65797
answer