2017-05-03 167 views
1

python3とtkinterを使って仮想ペットスタイルのゲームを作りたいと思っています。これまでのところ、メインウィンドウがあり、ラベルを貼り始めましたが、私が持っている問題はアニメーションgifを再生することです。私はここで検索し、いくつかの答えを見つけましたが、彼らはエラーを投げつけ続けます。私が見つけた結果、PhotoImageを使ったGIFのインデックス位置は一定の範囲を超えています。アニメーションGIFをPythonでtkinterで再生する

# 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

私が何を望むか、完全に離れるのですか?事前にVirtPet_Python

ありがとう:

はここで完全なプロジェクトを見るためにGitHubのリポジトリへのリンクです!

+1

'ind'が100を超えないことを確認してはいけませんか?たぶん 'ind%= 100'ですか? –

答えて

2

エラーは、100フレームを読み込もうとしましたが、gifのフレーム数が100フレーム未満です。

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

それは私に考えさせました...私はこのgifを作成し、いくつのフレームがあるかを知っているので、範囲を13に変更しました。これでロードされ、端末が「範囲外のインデックス」エラーに陥る。私はその下の関数内の他のすべての数値を調整しました。フレームを数え、それを変数に格納してから範囲内で呼び出す方法はありますか? – nmoore146

+0

いいえ、私のコードで行ったように、EOF(ファイルの終わり)エラーが出るまでフレームをループすることができます。 – Novel

+0

私はコードを編集してGitHubにプッシュしました。今は13フレームをループしますが、完全な画像は表示されず、すべてのフレームを通過すると範囲外のエラーが発生します。 – nmoore146

関連する問題