2

ゲームで使用するマップのベースを作成しようとしていますが、画像を画面に読み込めません。Likesameの大文字小文字を使用して画像に絶対ファイルパスを送信し、画像の名前を変更し、作成した他のプログラムで機能するさまざまな画像を読み込んで、スクリプト自体と同じディレクトリにある画像。まだ何も機能していません。同じ問題を抱えている人々のスレッドをいくつか調べました。たとえば、pygameの画像が読み込まれないのはなぜですか。そして、私は自分の問題に対する答えを見つけることができません。画像が読み込まれません。コードは次のとおりです。

import sys, pygame
from pygame.locals import *

pygame.init()
size = (600, 400)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Practice Map")
walls = pygame.image.load("C:\Users\dylan\Desktop\Practice Game\brick.jpg")

x = 0
y = 0

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            sys.exit()
        if event.type == KEYDOWN and event.key == K_UP:
            y -= 20
        if event.type == KEYDOWN and event.key == K_DOWN:
            y += 20
        if event.type == KEYDOWN and event.key == K_LEFT:
            x -= 20
        if event.type == KEYDOWN and event.key == K_RIGHT:
            x += 20
        screen.fill((0,0,0))
        screen.blit(walls,(x, 330))
        # more bricks to go here later
        pygame.display.flip()

#end

とエラー:

Traceback (most recent call last):
  File "C:\Users\dylan\Desktop\Practice Game\move.py", line 8, in <module>
    walls = pygame.image.load("C:\Users\dylan\Desktop\Practice Game\brick.jpg")
error: Couldn't open C:\Users\dylan\Desktop\Practice Gamerick.jpg

エディターとしてIDLEを使用したPythonバージョン2.6用のPyGame1.9でPython2.6を使用しています。

4

3 に答える 3

5

ここでの問題は、\ をパス名の区切り記号として使用していることですが、\ は Python 文字列のエスケープ文字としても使用されています。特に、\bは「バックスペース」 (または'\x08') を意味します。未知のエスケープ シーケンス\Xがバックスラッシュの後にX.

次の 3 つの解決策があります。

  1. 生の文字列を使用します。つまり、Python 文字列エスケープは無視されます: r"C:\Users\dylan\Desktop\Practice Game\brick.jpg".
  2. バックスラッシュをエスケープします: "C:\\Users\\dylan\\Desktop\\Practice Game\\brick.jpg".
  3. 代わりにスラッシュを使用してください: "C:/Users/dylan/Desktop/Practice Game/brick.jpg".

Python エスケープ シーケンスのリストを覚えており、変更される可能性はあるがおそらく変更されない機能に依存する意思がある場合は、\bhere をエスケープするだけで済みますが、他の 3 つが優れたアイデアである理由は明らかです。長い目で見れば。

Windows のパス名はバックスラッシュ区切り記号をネイティブに使用しますが、すべての組み込みおよび標準ライブラリの Python 関数、およびサードパーティ ライブラリのほとんどの関数では、代わりにスラッシュを使用できます。(これが機能するのは、Windows がパスにスラッシュをまったく許可しないためです。)

これがどのように、そしてなぜ機能するのかを理解するために、文字列を出力してみてください:

>>> print "C:\Users\dylan\Desktop\Practice Game\brick.jpg"
C:\Users\dylan\Desktop\Practice Gamrick.jpg
>>> print r"C:\Users\dylan\Desktop\Practice Game\brick.jpg"
C:\Users\dylan\Desktop\Practice Game\brick.jpg
>>> print "C:\\Users\\dylan\\Desktop\\Practice Game\\brick.jpg"
C:\Users\dylan\Desktop\Practice Game\brick.jpg
>>> print "C:/Users/dylan/Desktop/Practice Game/brick.jpg"
C:/Users/dylan/Desktop/Practice Game/brick.jpg
于 2013-02-05T23:47:38.850 に答える
4
walls = pygame.image.load("C:\Users\dylan\Desktop\Practice Game\brick.jpg")

最後にエスケープする必要があります\

walls = pygame.image.load("C:\Users\dylan\Desktop\Practice Game\\brick.jpg")

編集:説明

,\の直後に ab があり、バックスペースのエスケープ シーケンスであるため、最後にエスケープする必要があります。これにより、シーケンスの前の文字が削除されます。これが、最後のバックスラッシュをエスケープする必要がある理由です。\\b

于 2013-02-05T23:40:29.513 に答える
2

Windows のパスでは、\区切り記号として文字が使用されることに注意してください。これらは、Python 文字列の「エスケープ」も意味します。

代わりに生の文字列を使用してみてください。

walls = pygame.image.load(r"C:\Users\dylan\Desktop\Practice Game\brick.jpg")

(文字列の前にあることに注意してくださいr"。)

于 2013-02-05T23:45:09.230 に答える