0

我发现 Pyglet 具有可以加载 zip 文件的类:http: //www.pyglet.org/doc/api/pyglet.resource.ZIPLocation-class.html

我是如何使用它的:

myzip = zipfile.ZipFile('testzip.zip')
myzip = pyglet.resource.ZIPLocation(myzip, '')
myzip = myzip.open('test.png', mode='rb')

但它返回的是<StringIO.StringIO instance at 0x41ec670>,所以我不能以我使用 pyglet.resource.image 的方式使用。我实际上将该文件作为纯文本获取。有什么方法可以转换吗?

4

2 回答 2

0

好吧,我想它仍然没有实现。该类唯一要做的就是在 StringIO 中返回文件的数据。使用纯 zipfile 做到这一点更加容易。我就是这样做的:

# That class is necessary, it's explained why in Loader's class comments
class Cleaner(dict):
   pass

class Loader:
    def __init__(self):
        self.sprite = pyglet.resource.image(self.unzip('test.png'))
        self.sprite = pyglet.resource.image(self.unzip('test2.png'))
    def unzip(self, file):
        zip = zipfile.ZipFile('test.zip')
        file = open('.buffer', 'wb')
        # without 'b' it wont work on windows
        file.write(zip.read(file))
        file.close()
        '''now the tricky part: pyglet save every file with weakref to
           dont load save thing more than once, it wouldnt let to load
           files from buffer so we need to block it somehow after each
           file reading i do that with empty dict class (dont need to import weakref)'''
        pyglet.resource._default_loader._cached_images = Cleaner()
        return 'data/.buffer'
于 2013-02-25T05:17:13.140 回答
0

我也试图弄清楚如何从 ZIP 加载文件。

显然,ZIPLocation 主要用于 Pyglet 以查找您使用它打开的 ZIP 的方式。您可以通过将 ZIP 文件添加到路径来打开它们:

pyglet.resource.path.append("./spam.zip")
pyglet.resource.reindex()
data = pyglet.resource.file("spam.txt").read()#Imagine spam.txt is inside the zip.
于 2013-05-06T07:11:46.643 回答