所以我有一个名为Images
的字典,它存储pygame.Surface
对象。我不必每次运行代码时都构建整个字典,我只想从文件中读取它。
这是我尝试用来腌制和取消腌制字典的代码:
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()
这给了我:
文件 "ZombieSurvival.py",第 1320 行,在init中 self.body_rect=self.body_image.get_rect(center=self.vector(
pygame.error: display Surface quit
pygame.Surface
对象实际上是围绕SDL_Surface的包装器,是由 SDL 库处理的 C 结构。必须通过调用 SDL 库的SDL_CreateRGBSurface()
函数来创建此结构。 这可能是在pygame.Surface.__init__()
的某个地方完成的.
但是,取消实例不会以正常方式初始化它。正如泡菜文档所说:
当一个类实例被解腌时,它的init(( 方法通常是 未调用
所以 C 结构永远不会初始化,一切都出错了。
我能够首先使用 pygame 的pygame.image.tostring()
函数将字典中的每个pygame.Surface
Images
转换为字符串,使用pygame.image.tostring()
来腌制字典。然后我腌Images
.每当我想使用Images
时,我都会解开它并使用pygame.image.fromstring()
将它中的每个字符串转换回pygame.Surface
。
但是,pygame.image.fromstring()
要求我们告诉它即将转换的pygame.Surface
的大小,因此我在使用pyame.image.tostring()
函数之前保存了每个pygame.Surface
的大小。
每次我要在pygame.Surface
上呼叫pygame.image.tostring()
时,我首先将pygame.Surface
的密钥(它在Images
中的位置(及其大小存储在具有字段key
和size
的class
实例中。我将此类的每个实例都存储在一个名为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