Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pickle中使用“uuu getstate”uuuu/“uuu setstate”失败,原因是;ValueError:大小需要为(整数宽度、整数高度)";_Python_Pygame_Pickle_Getstate - Fatal编程技术网

Python 在pickle中使用“uuu getstate”uuuu/“uuu setstate”失败,原因是;ValueError:大小需要为(整数宽度、整数高度)";

Python 在pickle中使用“uuu getstate”uuuu/“uuu setstate”失败,原因是;ValueError:大小需要为(整数宽度、整数高度)";,python,pygame,pickle,getstate,Python,Pygame,Pickle,Getstate,我正在尝试picklepygame.Surface对象,默认情况下该对象不可pickle。我所做的是将经典的picklability函数添加到类中并覆盖它。这样,它将与我的其余代码一起工作 class TemporarySurface(pygame.Surface): def __getstate__(self): print '__getstate__ executed' return (pygame.image.tostring(self,IMAGE_

我正在尝试pickle
pygame.Surface
对象,默认情况下该对象不可pickle。我所做的是将经典的picklability函数添加到类中并覆盖它。这样,它将与我的其余代码一起工作

class TemporarySurface(pygame.Surface):
    def __getstate__(self):
        print '__getstate__ executed'
        return (pygame.image.tostring(self,IMAGE_TO_STRING_FORMAT),self.get_size())

    def __setstate__(self,state):
        print '__setstate__ executed'
        tempsurf = pygame.image.frombuffer(state[0],state[1],IMAGE_TO_STRING_FORMAT)
        pygame.Surface.__init__(self,tempsurf)

pygame.Surface = TemporarySurface
下面是我尝试pickle几个递归对象时的回溯示例:

Traceback (most recent call last):
  File "dibujar.py", line 981, in save_project
    pickler.dump((key,value))
  File "/usr/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python2.7/pickle.py", line 562, in save_tuple
    save(element)
  File "/usr/lib/python2.7/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/usr/lib/python2.7/copy_reg.py", line 71, in _reduce_ex
    state = base(self)
ValueError: size needs to be (int width, int height)
让我困惑的是print语句没有被执行。
\uuu getstate\uuu
是否被调用?我在这里感到困惑,我也不确定应该提供什么信息。请告诉我是否有其他帮助。

因为,酸洗扩展类型的主要入口点是
\uuuuuuuuuuuuuuuuu
方法。鉴于此错误,默认的
\uuuu reduce\uuu
实现似乎与
pygame.Surface
的构造函数不兼容

因此,您最好为
曲面
提供一个
\uuuu reduce\uuuu
方法,或者通过
复制
模块在外部注册一个方法。我建议后者,因为它不涉及猴子修补。您可能需要以下内容:

import copy_reg

def pickle_surface(surface):
    return construct_surface, (pygame.image.tostring(surface, IMAGE_TO_STRING_FORMAT), surface.get_size())

def construct_surface(data, size):
    return pygame.image.frombuffer(data, size, IMAGE_TO_STRING_FORMAT)

construct_surface.__safe_for_unpickling__ = True
copy_reg.pickle(pygame.Surface, pickle_surface)
这就是你所需要的。确保模块的顶层有
construct\u surface
功能:取消勾选过程需要能够定位该功能,以便执行取消勾选过程(可能发生在不同的解释器实例中)。

,酸洗扩展类型的主要入口点是
\uuuuu reduce\uuuu
\uuuu reduce\uu ex\uuuu
方法。鉴于此错误,默认的
\uuuu reduce\uuu
实现似乎与
pygame.Surface
的构造函数不兼容

因此,您最好为
曲面
提供一个
\uuuu reduce\uuuu
方法,或者通过
复制
模块在外部注册一个方法。我建议后者,因为它不涉及猴子修补。您可能需要以下内容:

import copy_reg

def pickle_surface(surface):
    return construct_surface, (pygame.image.tostring(surface, IMAGE_TO_STRING_FORMAT), surface.get_size())

def construct_surface(data, size):
    return pygame.image.frombuffer(data, size, IMAGE_TO_STRING_FORMAT)

construct_surface.__safe_for_unpickling__ = True
copy_reg.pickle(pygame.Surface, pickle_surface)

这就是你所需要的。但是,请确保模块的顶层有
construct\u surface
函数可用:取消勾选过程需要能够找到该函数,以便执行取消勾选过程(这可能发生在不同的解释器实例中)。

它可能不会被调用,取决于不同代码段导入曲面的方式。如何使用
Surface
?您是否可以使用子类而不是monkeypatching
Surface
本身?好吧,我使用的是其他人的代码,这些代码在Surface对象周围传递,因此使用子类对我来说要困难得多。Surface正在正常使用,我只是在尝试对其进行pickle时遇到此错误。我发现了此错误:但是,您是否能够检索文件路径或id,并将其保存而不是实际像素?可能无法调用它,具体取决于不同的代码段导入
Surface
的方式。如何使用
Surface
?您是否可以使用子类而不是monkeypatching
Surface
本身?好吧,我使用的是其他人的代码,这些代码在Surface对象周围传递,因此使用子类对我来说要困难得多。曲面正在正常使用,我只是在尝试对其进行pickle时遇到此错误。我发现了此错误:但是,您是否能够检索文件路径或id,并将其保存而不是实际像素?