【问题标题】:Python 2.6: "Couldn't open image" errorPython 2.6:“无法打开图像”错误
【发布时间】:2013-01-21 01:19:10
【问题描述】:

我正在尝试为要用于游戏的地图制作基础,但我无法将图像加载到屏幕上。我尝试使用相同的字母大小写向图像发送绝对文件路径,我尝试更改图像的名称,我尝试加载在我制作的其他程序中工作的不同图像,我尝试将图像与脚本本身位于同一目录中。还没有任何效果。我查看了一些遇到相同问题的人的帖子,例如Why are my pygame images not loading?,但我找不到我的问题的答案。图像不会加载。代码如下:

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 用于 Python 2.6 版,IDLE 作为我的编辑器。

【问题讨论】:

    标签: python image pygame


    【解决方案1】:

    这里的问题是您使用 \ 作为路径名分隔符,但 \ 在 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
    

    【讨论】:

      【解决方案2】:
      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 是退格的转义序列。这将删除序列之前的字符。这就是为什么您需要转义最后一个反斜杠。

      【讨论】:

      • 真的吗?我见过的所有例子都没有,但它们都有效。我现在就试试。
      • 您需要解释为什么他必须转义最后一个 \ 而不是任何更早的 \ (至少其中一个也出现在小写字母之前)。或者,更好的是,告诉他转义 all 的 \ 字符。或者,更好的是,使用原始字符串或使用/ 字符。
      • 它有效,但我不必对我的任何其他程序执行此操作,并且它们运行良好。为什么一个程序会挑剔而另一个不会呢?我没有做任何不同的事情。
      • \b 是一个转义序列。注意你的错误是Gamerick.jpg而不是Game\brick.jpg。由于 windows 路径使用退格作为路径分隔符,因此请考虑使用原始字符串来关闭转义序列解释:r"Game\brick.jpg"
      • @DylanLaCoursiere:等到您尝试使用正则表达式来匹配其中包含 Python 转义序列的 Windows 补丁。 :) 是的,这是一个烦恼。但你不能责怪微软;这实际上主要是 IBM 的错。见blogs.msdn.com/b/larryosterman/archive/2005/06/24/432386.aspx
      【解决方案3】:

      请注意,Windows 路径使用\ 字符作为分隔符。这些也意味着 Python 字符串中的“转义”。

      尝试使用原始字符串:

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

      (注意字符串前面的r"。)

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多