2017-08-03 45 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時'功能? –