2017-05-03 826 views
1

我想用python3和tkinter創建一個虛擬寵物風格的遊戲。到目前爲止,我有主窗口,並開始放置標籤,但我遇到的問題是播放動畫GIF。我在這裏搜索並找到了一些答案,但他們一直在拋出錯誤。我發現使用PhotoImage的gif的索引位置在一定範圍內持續。用tkinter在python中播放GIF動畫

# Loop through the index of the animated gif 
frame2 = [PhotoImage(file='images/ball-1.gif', format = 'gif -index %i' %i) for i in range(100)] 

def update(ind): 

    frame = frame2[ind] 
    ind += 1 
    img.configure(image=frame) 
    ms.after(100, update, ind) 

img = Label(ms) 
img.place(x=250, y=250, anchor="center") 

ms.after(0, update, 0) 
ms.mainloop() 

當我在「pyhton3 main.py」終端運行此我得到以下錯誤:

_tkinter.TclError: no image data for this index

我是什麼俯瞰或徹底離開了呢?

這裏是鏈接到GitHub的倉庫看到完整的項目:VirtPet_Python

提前感謝!

+1

難道你不應該檢查'ind'永遠不會超過100嗎?也許'ind%= 100'? –

回答

2

這個錯誤意味着你試圖加載100幀,但gif小於這個值。

tkinter中的動畫gif非常糟糕。我以前寫過這段代碼,你可以竊取它,但是對於小GIF文件會產生延遲:

import tkinter as tk 
from PIL import Image, ImageTk 
from itertools import count 

class ImageLabel(tk.Label): 
    """a label that displays images, and plays them if they are gifs""" 
    def load(self, im): 
     if isinstance(im, str): 
      im = Image.open(im) 
     self.loc = 0 
     self.frames = [] 

     try: 
      for i in count(1): 
       self.frames.append(ImageTk.PhotoImage(im.copy())) 
       im.seek(i) 
     except EOFError: 
      pass 

     try: 
      self.delay = im.info['duration'] 
     except: 
      self.delay = 100 

     if len(self.frames) == 1: 
      self.config(image=self.frames[0]) 
     else: 
      self.next_frame() 

    def unload(self): 
     self.config(image=None) 
     self.frames = None 

    def next_frame(self): 
     if self.frames: 
      self.loc += 1 
      self.loc %= len(self.frames) 
      self.config(image=self.frames[self.loc]) 
      self.after(self.delay, self.next_frame) 

root = tk.Tk() 
lbl = ImageLabel(root) 
lbl.pack() 
lbl.load('ball-1.gif') 
root.mainloop() 
+0

這讓我想到了......我將範圍改爲13,因爲我創建了這個gif並知道它有多少幀。現在它的負載和終端卡在「索引超出範圍」的錯誤。我調整了下面的函數中的所有其他數字。有什麼方法可以計算幀並將其存儲在變量中,然後在範圍()中調用它? – nmoore146

+0

不,但是你可以循環幀,直到你得到EOF(文件結束)錯誤,就像我在我的代碼中那樣。 – Novel

+0

好吧,我編輯了我的代碼並將其推送到GitHub。現在它循環遍歷13幀,但完整的圖像沒有顯示出來,然後當它通過所有幀時,我得到一個索引超出範圍錯誤。 – nmoore146