2017-08-03 4 views
0

私はImagesという辞書を持っており、pygame.Surfaceというオブジェクトを格納しています。コードを実行するたびにこの辞書全体を構築するのではなく、ファイルから読み込むだけです。pygame.Surfaceオブジェクトを含む辞書をpicklingする

これは私が辞書をpickle化およびunpickle化するために使用しようとしていますコードです:

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

私を与える:

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) 

その後、私はこのコードを使用します

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.image.tostring()を使用して、文字列に、辞書Images内のすべてのpygame.Surfaceを変換するpygameののpygame.image.tostring()機能を使って、辞書をpickle化することができました。それから私はImagesを漬けた。 Imagesを使用するときはいつでも、私はそれをアンピクルし、その中のすべての文字列をpygame.Surfacepygame.image.fromstring()を使って戻します。

しかし、pygame.image.fromstring()はそれを、変換しようとしているpygame.Surfaceの大きさを伝えるために私たちを必要とするので、私はpyame.image.tostring()機能を使用する前に、私は、各pygame.Surfaceのサイズを救いました。私はpygame.Surfacepygame.image.tostring()を呼び出すことを約あった都度

、私が最初にpygame.Surfaceのキー(それはImages内の位置です)とフィールドkeysizeclassのインスタンスで、そのサイズを保存。このクラスのすべてのインスタンスをlist_of_image_sizesというリストに保存し、リストをpickleしました。あなたが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()関数を呼び出すことで作成する必要があります。 これはおそらく​​のどこかで行われます。

しかし、インスタンスをunpickleしても、インスタンスは通常の方法で初期化されません。 pickle documentationはこう言っています:

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

したがって、C構造は決して初期化されず、すべてが間違っています。

+0

ので、unpickle化中に 'SDL_CreateRGBSurface()'関数を呼び出す方法がないのですか? –

関連する問題