2017-08-03 1 views
0

So habe ich ein Wörterbuch mit der Bezeichnung Images und speichert pygame.Surface Objekte. Anstatt jedes Mal das gesamte Wörterbuch zu erstellen, wenn ich den Code ausführe, möchte ich es nur aus einer Datei einlesen.Picking ein Wörterbuch, das pygame.Surface Objekte enthält

Dies ist der Code, dass ich das Wörterbuch zu verwenden, ich versuche zu beizen und 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) 

Später, verwende ich diesen Code:

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

, die mir gibt:

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

Antwort

0

konnte ich das Wörterbuch beizen, indem man zuerst pygame die mit pygame.image.tostring() Funktion jedes pygame.Surface im Wörterbuch Images, in eine Zeichenfolge zu konvertieren, mit pygame.image.tostring(). Dann habe ich gebeizt Images. Wann immer ich Images verwenden möchte, ich flippe es aus und konvertiere jeden String in es zurück gehen Sie pygame.Surface mit pygame.image.fromstring().

jedoch pygame.image.fromstring() erfordert, dass wir es, die Größe des pygame.Surface zu sagen, dass es im Begriff ist, zu konvertieren, so gespeichert ich die Größen jeder pygame.Surface, bevor ich die pyame.image.tostring() Funktion verwendet.

Bei jeder Gelegenheit, wo ich war über pygame.image.tostring() auf einem pygame.Surface zu nennen, habe ich zunächst die pygame.Surface ‚s-Taste (die Lage in Images) und seine Größe in einer Instanz einer class mit Feldern key und size gespeichert. Ich speicherte jede Instanz dieser Klasse in einer Liste mit dem Namen list_of_image_sizes und löschte die Liste.

Wenn Sie nun die pygame.image.fromstring() Funktion verwenden, können Sie es als solches nennen:

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 Objekte sind eigentlich ein Wrapper um eine SDL_Surface, die eine C s ist tructure von der SDL-Bibliothek behandelt. Diese Struktur muss mit einem Aufruf der SDL_CreateRGBSurface()-Funktion der SDL-Bibliothek erstellt werden. Dies ist wahrscheinlich irgendwo in pygame.Surface.__init__() getan.

Aber das Entpacken einer Instanz initialisiert es nicht auf normale Weise. Wie die pickle documentation sagt:

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

So ist die C-Struktur nie initialisiert und alles schief geht.

+0

So gibt es keine Möglichkeit, die 'SDL_CreateRGBSurface()' Funktion während des Unpickling anrufen? –

Verwandte Themen