关于错误:无法打开.png文件(Python:错误:无法打开.png文件(Python – Pygame库)

error: Couldn't open .png file (Python - Pygame library)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import pygame
import os
import sys
import time
from   pygame.locals import *

pygame.init()

#Colours here
RED      =  pygame.Color(150,   0,   0)
GREEN    =  pygame.Color(  0, 150,   0)
BLUE     =  pygame.Color(  0,   0, 150)
BLACK    =  pygame.Color(  0,   0,   0)
WHITE    =  pygame.Color(255, 255, 255)

FPS = pygame.time.Clock()

WIDTH  = 1024
HEIGHT = 768
SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Penaldo v0.1')

#Set BACKGROUND to an instance of pygame.Surface, which will get its coordinates from the previous ones we assigned to the game's display
BACKGROUND = pygame.Surface((SCREEN.get_width(), SCREEN.get_height()))

SCREEN.blit(BACKGROUND, (0, 0))

key_press = pygame.key.get_pressed()

class Player():
    def __init__(self):


        #Try to load our sprite.
        #'r' makes it a raw string so it ignores escape sequences

        self.player = pygame.image.load(r"\..\..
esources\mario_sprite_by_killer828-d3iw0tz.png"
)
        self.p_rect = self.player.get_rect()

        #Spawn the player just in the middle of our screen
        self.p_rect.centerx = WIDTH / 2
        self.p_rect.centery  = HEIGHT / 2

    def move(self):
        if key_press[UP]:
            self.p_rect.y -= 5

        elif key_press[DOWN]:
            self.p_rect.y += 5

        elif key_press[LEFT]:
            self.p_rect.x -= 5

        elif key_press[RIGHT]:
            self.p_rect.x += 5

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
        #Some IDLE friendliness (prevents from hanging)
            pygame.quit()
            sys.exit()


    BACKGROUND.fill(GREEN)

    p1 = Player()

    # FOR THE GAME TO WORK you have to include this one inside main while-loop (no display update = no game)
    pygame.display.update()
FPS.tick(40)

完整的错误消息是:

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File"C:\Users
ZXT\Documents\GameLab\Penaldo\game\version1\Penaldo.py"
, line 79, in <module>
    p1 = Player()
  File"C:\Users
ZXT\Documents\GameLab\Penaldo\game\version1\Penaldo.py"
, line 49, in __init__
    self.player = pygame.image.load(r"\..\..
esources\mario_sprite_by_killer828-d3iw0tz.png"
)
error: Couldn't open \..\..
esources\mario_sprite_by_killer828-d3iw0tz.png

我读了一些问题,如python 2.6:"无法打开图像"错误,错误:无法打开图像,我尝试实现不同的提示,但窗口变黑并挂起。


通常,为了确保图像文件可以在不引发有关找不到图像的错误的情况下加载,请将该图像与程序放在同一文件夹中。至于pycharm用户,只需将文件复制并粘贴到当前具有正确程序的项目中。如果你不喜欢用另一种方式,使用os.path.join()可能会更好。如果你有时间的话,试着去Pygame文档了解更多信息。您的问题是您使用的是反斜杠(),而不是正斜杠(/)。您应该从以下位置更改路径:

1
2
\..\..
esources\mario_sprite_by_killer828-d3iw0tz.png

到:

1
/../../resources/mario_sprite_by_killer828-d3iw0tz.png

这个答案值得赞扬,您的问题的真正解释可以在堆栈溢出的这个问题中找到:python 2.6:"cannot't open image"错误希望这对你有帮助!哦,如果上面的问题链接没有帮助,请使用pygame docs链接。


我有一些想法。

  • 可能您输入的图像名称不正确。
  • 或者路径中的文件夹不存在。
  • 你可能把文件放错地方了。
  • 你没有考虑你的操作系统。
  • 以下是一些建议:

  • pygame.image.load内使用os.path.join('..', '..', 'resources', 'mario_sprite_by_killer828-d3iw0tz.png')而不是反斜杠。这将正确加载Linux、Windows和Mac,无论您使用哪一种。

  • 尝试使用更具组织性的安排,这样就不需要进行迄今为止的回溯。

  • 检查和/或重命名文件以确保使用的路径正确。确保文件实际上是PNG。

  • 使用os.chdir将当前目录更改为包含映像的文件夹,然后像通常那样使用pygame.image.load('mario_sprite_by_killer828-d3iw0tz.png')

  • 试试这个。顺便说一句,您的键事件不会像预期的那样工作,因为键按下变量没有持续更新,您只是在开始时对它进行了初始化。


    看看那个/../../I,我发现您正试图根据用户到图像的文件路径来查找动态文件路径?这不是它的工作原理,这就是为什么你会犯这个错误。它找不到.png文件,因为没有如下内容:

    1
    2
     \..\..
    esources\mario_sprite_by_killer828-d3iw0tz.png

    您可以看看这篇解释得很好的文章:Python中的相对路径