2015-02-14 12 views
8

Ich habe versucht, ein animiertes GIF unter Verwendung Tkinter.PhotoImage zu spielen, aber habe keinen Erfolg gesehen. Es zeigt das Bild, aber nicht die Animation an. Das Folgende ist mein Code:Animationen in GIF mit Tkinter abspielen

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

Es zeigt das Bild in einem Fenster, und das ist es. Ich denke, dass das Problem etwas mit Tkinter.Label zu tun hat, aber ich bin mir nicht sicher. Ich habe nach Lösungen gesucht, aber alle sagen mir, dass ich PIL (Python Imaging Library) verwenden soll, und das möchte ich nicht verwenden.

Mit der Antwort, habe ich etwas mehr Code (das funktioniert immer noch nicht ...), hier ist es:

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 = "https://stackoverflow.com/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() 

Vielen Dank für alles! :)

+1

Sie könnten überprüfen, ob es durch die Verwendung es stattdessen auf einem 'Canvas' Widget (' C zu einem 'Label' Widget angebracht hat etwas mit dem Sein create_image (x, y, image = photo'). – martineau

+0

Ich weiß nicht, ob ich etwas mit 'Canvas' falsch mache, aber ich bekomme nur die untere rechte Ecke meines Bildes und es sieht pixelig aus ... – Zizouz212

+1

Versuch es zu bekommen es funktioniert zuerst mit einem nicht-animierten Bild, dann wechseln Sie zu einem animierten. – martineau

Antwort

7

Sie müssen die Animation selbst in Tk fahren. Ein animiertes GIF besteht aus einer Anzahl von Frames in einer einzigen Datei. Tk lädt das erste Bild, aber Sie können verschiedene Bilder angeben, indem Sie beim Erstellen des Bildes einen Indexparameter übergeben. Zum Beispiel:

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

Wenn Sie alle Bilder in separate PhotoImages laden und dann Timer-Ereignisse verwenden, um den Rahmen zu wechseln wird angezeigt (label.configure(image=nextframe)). Mit der Verzögerung des Timers können Sie die Animationsgeschwindigkeit steuern. Es ist nichts vorgesehen, um Ihnen die Anzahl der Bilder in dem Bild zu geben, außer dass es nicht möglich ist, einen Rahmen zu erzeugen, sobald Sie die Rahmenanzahl überschreiten.

Siehe die photo Tk Handbuchseite für das offizielle Wort.

+2

Klingt wie ein t [Kludge] (https://en.wikipedia.org/wiki/Kludge). – martineau

+0

Und ich sollte auch fragen, ob es eine Möglichkeit gibt, die Anzahl der Bilder für ein Bild zu bestimmen; Versucht dies: http://stackoverflow.com/questions/7503567/python-how-i-can-get-gif-frames/7504131#7504131 Gibt es auch für 2500 Bilder, eine Möglichkeit, es jemals automatisch machen? – Zizouz212

+0

Siehe http://en.wikipedia.org/wiki/GIF#Animated_GIF für das Layout. Die GIF-Datei enthält keine Anzahl von Frames - nur die Verzögerung pro Frame, die variabel sein kann. – patthoyts

2

Hier ist ein einfacheres Beispiel, ohne ein Objekt zu erstellen:

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() 
+2

Können Sie Ihren Code erklären, damit andere daraus lernen können, anstatt einen Code zu kopieren und einzufügen, der funktionieren kann oder nicht? – Robert

+0

Es sieht so aus, als könnte es funktionieren, aber es tritt ein Listenindex außerhalb des Bereichs für frame = frames [ind] –