2017-08-03 25 views
0

所以我有一个名为Images的字典,它存储pygame.Surface对象。我不需要每次运行代码时都需要构建整个字典,我只想从文件中读取它。腌制一个包含pygame的字典。表面物体

这是我试图用咸菜和unpickle字典代码:

with open('Images.pkl', 'wb') as output: 
    pickle.dump(Images, output, pickle.HIGHEST_PROTOCOL) 

with open('Images.pkl', 'rb') as input: 
    Images = pickle.load(input) 

后来,我用这个代码:

class Survivor: 
    def __init__(self): 
     self.body_image=Images['Characters/Survivor/handgun/idle0'] 
     self.body_rect=self.body_image.get_rect() 

这给了我:

File "ZombieSurvival.py", line 1320, in init self.body_rect=self.body_image.get_rect(center=self.vector)
pygame.error: display Surface quit

回答

0

我能够首先使用pygame的的pygame.image.tostring()功能,每pygame.Surface转换字典中的Images,一个字符串,使用pygame.image.tostring(),以酸洗字典。然后我腌制Images。无论何时我想使用Images,我将它取出并将其中的每个字符串转换回pygame.Surface,使用pygame.image.fromstring()

然而,pygame.image.fromstring()要求我们告诉它pygame.Surface,这是关于转换的大小,所以我保存的每个pygame.Surface的大小之前,我使用的pyame.image.tostring()功能。

在每一个场合,我正要叫pygame.image.tostring()pygame.Surface,我先存储在pygame.Surface的键(它在Images位置),其大小在class的实例,该领域keysize。我将这个类的每个实例都存储在名为list_of_image_sizes的列表中,并对列表进行了腌制。

现在,当您使用pygame.image.fromstring()功能,可以调用它是这样:

for data in list_of_image_sizes: 
    Images[data.key]=pygame.image.fromstring(Image[data.key], data.size, 'RGBA') 
    #RGBA is my particular argument, you can change it as you wish 
1

pygame.Surface对象实际上是一个围绕SDL_Surface的包装,它是一个C s由SDL库处理的结构。必须通过调用SDL库的SDL_CreateRGBSurface()函数来创建此结构。 这可能是在​​某处完成的。

但取消一个实例不会以正常方式初始化它。正如pickle documentation所说:

When a class instance is unpickled, its init() method is usually not invoked

所以C结构从不初始化,一切都出错了。

+0

那么,有没有一种方法来调用'SDL_CreateRGBSurface()将在unpickle时'功能? –