Python 2.6: "无法打开图像"错误

2 投票
3 回答
7129 浏览
提问于 2025-04-17 14:53

我正在为一个游戏制作地图的基础,但我无法把图片加载到屏幕上。我试过用绝对路径来加载图片,确保字母大小写完全一致;我也试过更改图片的名字;还尝试过加载在其他程序中能正常工作的不同图片;甚至把图片放在和脚本同一个文件夹里。可是到现在为止,什么都没用。我查看了一些遇到同样问题的帖子,比如为什么我的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

我使用的是Python 2.6和PyGame 1.9,编辑器是IDLE。

3 个回答

2

请注意,Windows系统的文件路径使用\这个符号来分隔不同的文件夹和文件。而在Python字符串中,这个符号也有“转义”的意思。

可以试试使用原始字符串(raw string):

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

(注意字符串前面有r"这个部分。)

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")

编辑: 解释

你需要对最后一个 \ 进行转义,因为在这个 \ 后面紧跟着一个 b,而 \b 是一个特殊的转义序列,表示退格。这会删除转义序列前面的那个字符。所以你需要对最后的反斜杠进行转义。

5

这里的问题是,你在使用反斜杠(\)作为路径分隔符,但在Python字符串中,反斜杠也是用作转义字符。特别是,\b表示“退格”(或者说是'\x08')。其他的反斜杠之所以能用,是因为有一种不太文档化但可靠的行为:像\X这样的未知转义序列会被当作一个反斜杠后面跟着一个X来处理。

解决这个问题有三种方法:

  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的转义序列,并且愿意依赖可能会改变但大概率不会改变的功能,你可以只对\b进行转义,但从长远来看,其他三种方法显然更好。

虽然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

撰写回答