web-dev-qa-db-ja.com

TkinterでGIFのアニメーションを再生する

Tkinter.PhotoImageを使用してアニメーションgifを再生しようとしましたが、成功していません。画像は表示されますが、アニメーションは表示されません。以下は私のコードです:

root = Tkinter.Tk()
photo = Tkinter.PhotoImage(file = "path/to/image.gif")
label = Tkinter.Label(image = photo)
label.pack()
root.mainloop()

ウィンドウに画像を表示し、それだけです。この問題はTkinter.Labelと関係があると考えていますが、よくわかりません。私は解決策を探しましたが、彼らはすべてPIL(Python Imaging Library)を使用するように言っており、それは私が使いたくないものです。

答えで、私はさらにいくつかのコードを作成しました(まだ動作しません...)、ここにあります:

from Tkinter import *

def run_animation():
    while True:
        try:
            global photo
            global frame
            global label
            photo = PhotoImage(
                file = photo_path,
                format = "gif - {}".format(frame)
                )

            label.configure(image = nextframe)

            frame = frame + 1

        except Exception:
            frame = 1
            break

root = Tk()
photo_path = "/users/zinedine/downloads/091.gif"

photo = PhotoImage(
    file = photo_path,
    )
label = Label(
    image = photo
    )
animate = Button(
    root,
    text = "animate",
    command = run_animation
    )

label.pack()
animate.pack()

root.mainloop()

すべてに感謝します! :)

11
Zizouz212

Tkでアニメーションを自分で操作する必要があります。アニメーションgifは、1つのファイル内のいくつかのフレームで構成されます。 Tkは最初のフレームをロードしますが、画像の作成時にインデックスパラメーターを渡すことにより、異なるフレームを指定できます。例えば:

_frame2 = PhotoImage(file=imagefilename, format="gif -index 2")
_

すべてのフレームを別々のPhotoImageにロードし、タイマーイベントを使用して、表示されているフレームを切り替える場合(label.configure(image=nextframe))。タイマーの遅延により、アニメーションの速度を制御できます。フレームカウントを超えるとフレームの作成に失敗すること以外、画像内のフレーム数を提供するものはありません。

公式のWordについては photo Tkのマニュアルページを参照してください。

8
patthoyts

オブジェクトを作成せずに簡単な例を示します。

from tkinter import *
import time
import os
root = Tk()

frames = [PhotoImage(file='mygif.gif',format = 'gif -index %i' %(i)) for i in range(100)]

def update(ind):

    frame = frames[ind]
    ind += 1
    label.configure(image=frame)
    root.after(100, update, ind)
label = Label(root)
label.pack()
root.after(0, update, 0)
root.mainloop()
5
Alex