2

だから、私はこれのためにネット上でいくつかの解決策を試しましたが、それぞれが異なるエラーを返します。最近、私は次のようなことを試すことにしました。

import cStringIO, pygame, os
from pygame.locals import *

pygame.init()
mainClock = pygame.time.Clock()
WINDOWWIDTH = 640
WINDOWHEIGHT = 480
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption('StringIO Test')

with open("image.png", "rb") as infile:
    outfile = cStringIO.StringIO()
    outfile.write(infile.read())


class DummyFile:
    def __init__(self, data):
       self.data = data
        self.pos = 0

    def read(self, size=None):
        start = self.pos
        end = len(self.data) - 1

        if size is not None:
            end = min(len(self.data), self.pos + size)

        self.pos = end
        return self.data[start:end]

    def seek(self, offset, whence=0):
        if whence == 0:
            self.pos = offset
        elif whence == 1:
            self.pos = self.pos + offset
        elif whence == 2:
            self.pos = len(data) + offset    

    def write(self):
        pass

while True:
    windowSurface.fill((0,0,0))
    testIm = pygame.image.load(DummyFile(outfile.getvalue()))
    testImRect = testIm.get_rect()
    testImRect.topleft = (0,0)
    windowSurface.blit(testIm, testImRect)
    pygame.display.flip()

これはちょうど戻ります:

error: Can't seek in this data source

基本的に、私のプログラムは画像ファイルを暗号化/復号化し、ユーザーが復号化されたコピーをハードドライブに保存せずにそれらを表示できるようにします。別の質問で、stringIOオブジェクトはこの目的で機能すると言われました。Pythonのドキュメントでは、cStringIOを広範囲に使用する場合はcStringIOを提案しています。pygameの問題は、オブジェクトを画像として取得することを望まないことです。何か案は?

4

1 に答える 1

5

これをDummyFileに追加します

def tell(self):
    return self.pos

そのメソッドが欠落しているため、ファイルのようなオブジェクトはシークできないと見なされます。__ getattr __メソッドをDummyFileに追加し、どのような種類のメソッドが呼び出されるかを確認することで、それを理解しました。

于 2013-03-26T18:06:34.210 に答える