1

Python 2.7 と Tkinker を使用してループで gif を再生しようとしています。ラズベリーパイで実行する予定ですが、より強力なMacbook proでも実装が遅れています. 実装方法の例を次に示します。

frames= [] #holds gif images
weatherIND = 0 #frame of gif currently being displayed


#processes and initializes gif, then starts the loop 
def getWeather() 
   global frames

   frames= []
   self.processImage("assets/Rain.gif")
   print("frames len = " + str(len(frames)))

   Photo = frames[0] #initialize 

   self.iconLbl.config(image=Photo)
   self.iconLbl.image = Photo
   self.after(0, self.update) #start the loop

#displays the next frame of the gif every 20 ms 
def update(self):
    global weatherInd
    global frames

    if weatherInd == (len(frames)):
        weatherInd = 0
    Photo = frames[weatherInd]

    self.iconLbl.config(image=Photo)
    self.iconLbl.image = Photo

    weatherInd+=1

    self.after(20, self.update)


#takes a gif and puts each frame in a list as a PhotoImage object
def processImage(self, path):
    '''
    Iterate the GIF, extracting each frame.
    '''
    global frames

    mode = 'global'

    im = Image.open(path)

    i = 0
    p = im.getpalette()
    last_frame = im.convert('RGBA')

    try:
        while True:
            print "saving %s (%s) frame %d, %s %s" % (path, mode, i, im.size, im.tile)

            '''
            If the GIF uses local colour tables, each frame will have its own palette.
            If not, we need to apply the global palette to the new frame.
            '''
            if not im.getpalette():
                im.putpalette(p)

            new_frame = Image.new('RGBA', im.size)

            '''
            Is this file a "partial"-mode GIF where frames update a region of a different size to the entire image?
            If so, we need to construct the new frame by pasting it on top of the preceding frames.
            '''
            if mode == 'partial':
                new_frame.paste(last_frame)

            new_frame.paste(im, (0,0), im.convert('RGBA'))


            new_frame = new_frame.resize((100,100), Image.ANTIALIAS)
            Photo = ImageTk.PhotoImage(new_frame)
            frames.append(Photo)

            i += 1
            last_frame = new_frame
            im.seek(im.tell() + 1)
    except EOFError:
        pass

ここでの問題は、gif の再生中に、5 ~ 10 秒ごとに 1/2 ~ 1 秒間フレームにハングアップすることです。これは、gif フレームを 20 ミリ秒ごとに処理またはサイズ変更しようとしている場合に予想されますが、前処理された画像でラベルを更新しているだけだと思います。tkinter が遅れないように、これを行うより効率的な方法はありますか?

4

0 に答える 0