gif animation rudimentare

of course i would never use a gif animation in my programs.

thats just a very rudimentare code and it should only display how easy it is to dig in a gif, fli or in your own format by using pil.

this code runs a gif (uncompressed) animation:

'''
Created on 27.06.2011

@author: dirk hochegger
'''

from direct.directbase import DirectStart
from pandac.PandaModules import *
from PIL import *
import Image, ImageSequence


class gifANIM():
    def __init__(self):
        self.timer = 0
        self.speed = 4
        self.frame = 0
        
        im = Image.open("yourGIF.gif")
        self.tex = {} 
        id = 0

        for frame in ImageSequence.Iterator(im):
            self.tex[id] = Texture() 
            buffer = PTAUchar.emptyArray(0) 
            buffer.setData(frame.tostring()) 
            self.tex[id].setFormat(Texture.FRgb ) # format information "http://www.panda3d.org/reference/1.7.2/python/classpanda3d.core.Texture.php#ab4e88c89b3b7ea1735996cc4def22d58" if you get this error back -> AssertionError: compression != CM_off || image.size() == do_get_expected_ram_image_size()
            self.tex[id].setXSize(im.size[0]) 
            self.tex[id].setYSize(im.size[1])
            self.tex[id].setRamImage(CPTAUchar(buffer), Texture.CMOff) 
            id+=1

        self.ts = TextureStage('ts')
        self.screen = self.createCARD(self.tex[20],1,1)
        
        taskMgr.add(self.play,"play")
        
    def createCARD(self,
                   tex,
                   u,
                   v):
        
        card = CardMaker("gifanim")
        tile = NodePath(card.generate())
        tile.reparentTo(render2d)
        tile.setTexScale(self.ts,u,v) 
        tile.setTexture(self.ts, tex)
        return tile
    
    def play(self,task):
        self.timer +=1
        if self.timer > self.speed:
            self.screen.setTexture(self.ts,self.tex[self.frame])
            if self.frame < len(self.tex)-1:
                self.frame += 1
            else:
                self.frame = 0
            self.timer = 0
        return task.cont
    
g=gifANIM()
run()