2015-02-14 14 views
8

Ho cercato di riprodurre una gif animata utilizzando Tkinter.PhotoImage, ma non ho riscontrato alcun successo. Visualizza l'immagine, ma non l'animazione. Quello che segue è il mio codice:Riproduci animazioni in GIF con Tkinter

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

Visualizza l'immagine in una finestra e il gioco è fatto. Sto pensando che il problema abbia a che fare con lo Tkinter.Label ma non ne sono sicuro. Ho cercato soluzioni ma tutti mi dicono di usare PIL (Python Imaging Library), ed è qualcosa che non voglio usare.

Con la risposta, ho creato un po 'di codice (che ancora non funziona ...), eccolo:

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

Grazie di tutto! :)

+1

Si potrebbe verificare se ha qualcosa a che con l'essere attaccato ad un widget 'label' usandolo invece su un widget' Canvas' ('C. create_image (x, y, image = photo'). – martineau

+0

Non so se sto facendo qualcosa di sbagliato con 'Canvas' ma ottengo solo l'angolo in basso a destra della mia immagine e sembra pixelato ... – Zizouz212

+1

Prova ad ottenere funziona prima con un'immagine non animata, poi passa a quella animata successiva – martineau

risposta

7

Devi guidare l'animazione da solo in Tk. Una gif animata consiste in un numero di frame in un singolo file. Tk carica il primo fotogramma ma è possibile specificare diversi fotogrammi passando un parametro indice durante la creazione dell'immagine. Ad esempio:

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

Se si carica tutti i fotogrammi in PhotoImages separati e quindi utilizzare eventi timer per commutare il telaio essendo mostrata (label.configure(image=nextframe)). Il ritardo sul timer consente di controllare la velocità di animazione. Non è fornito nulla per darti il ​​numero di fotogrammi nell'immagine oltre a non riuscire a creare una cornice una volta superato il numero di fotogrammi.

Vedere la pagina di manuale Tk photo per la parola ufficiale.

+2

Sembra un t [Kludge] (https://en.wikipedia.org/wiki/Kludge). – martineau

+0

E dovrei anche chiedere se esiste un modo per determinare il numero di frame per un'immagine; Ho provato questo: http://stackoverflow.com/questions/7503567/python-how-i-can-get-gif-frames/7504131#7504131 Inoltre, per 2500 immagini, c'è un modo per renderlo automatico? – Zizouz212

+0

Vedere http://en.wikipedia.org/wiki/GIF#Animated_GIF per il layout. Il file GIF non contiene un numero di frame - solo il ritardo per frame che può essere variabile. – patthoyts

2

Ecco un esempio più semplice, senza la creazione di un oggetto:

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

Puoi spiegare il tuo codice, in modo che altri possano imparare da esso invece di copiare e incollare un pezzo di codice che potrebbe funzionare o meno? – Robert

+0

Sembra che funzioni, ma lancia un indice di lista fuori intervallo per frame = frame [ind] –