Animated gif in Tkinter

Fragen zu Tkinter.
Antworten
AndiArbeit
User
Beiträge: 21
Registriert: Freitag 11. Juli 2014, 13:26

Guten Tag liebes Forum,
ich arbeite momentan an einem Projekt indem ich verschiedene GIFS in TKinter abspielen möchte.
Hierzu mein Code.

In OpenSuse läuft das ganze so wie ich möchte, allerdings benötige ich dieses Tool in Windows und da wird zwar das TKInter Fenster angezeigt jedoch nicht die einzelnen Bilder.

Vielen Dank im Voraus für eure Hilfe

Code: Alles auswählen

import os
import Tkinter as tk
import time


def gifoeffnen(name,gifnr) :

  giffenster = tk.Tk()

  label = tk.Label()
  label.pack()

  counter = 0

  while counter < gifnr :
  
    photo = tk.PhotoImage(file=name, format="gif -index " + str(counter))
    label.config(image = photo)
    time.sleep(0.05)
    giffenster.update()
    counter += 1
  
    if counter > gifnr :
      giffenster.destroy()
      
gifoeffnen("test.gif",21)
AndiArbeit
User
Beiträge: 21
Registriert: Freitag 11. Juli 2014, 13:26

Entschuldigt Bitte, das Script läuft auf beiden Systemen so. Der Fehler lag in meinem Script.

Schönes Wochenende
Dynojezz
User
Beiträge: 2
Registriert: Freitag 6. September 2019, 12:43

Dein Script hat mir grade sehr geholfen :D vielen Dank!
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das nicht sauber ist das ohne `mainloop()` zu machen. Damit kann man sich bei etwas umfangreicheren Anwendungen subtile Probleme einfangen und es skaliert natürlich nicht, weil man die Hauptschleife nur *einmal* selbst nachprogrammieren kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal auf dem normalen Weg mit Tk-Hauptschleife:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk


def show_frame(label, gif_filename, index, max_index):
    if index <= max_index:
        image = tk.PhotoImage(file=gif_filename, format=f"gif -index {index}")
        label["image"] = image
        label.image = image
        label.after(50, show_frame, label, gif_filename, index + 1, max_index)
    else:
        label.quit()


def show_animation(gif_filename, max_index):
    root = tk.Tk()
    label = tk.Label(root)
    label.pack()
    show_frame(label, gif_filename, 0, max_index)
    root.mainloop()


if __name__ == "__main__":
    show_animation("test.gif", 79)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

Hallo, es ist schon länger her das hier was geschrieben wurde, aber ich würde mich trotzdem über eine Antwort freuen.

Ich habe den obenstehenden Code ausprobiert, aber das gif spielt sich nur einmal ab und dann kommt folgende Meldung:

Code: Alles auswählen

_tkinter.TclError: no image data for this index
Ich hoffe ihr könnt mir helfen wo der Fehler liegt. :-)

Ich benutze Python Version 3.8.5 und habe Windows 10.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann stimmt halt die Anzahl der Bilder nicht, und wenn Du Wiederholung willst, dann mußt Du den Index wieder auf 0 setzen.
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

@Sirius3 Kannst du bitte ein Beispiel schreiben.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo ist denn konkret das Problem? Dass Du die Laufweite Deines Indexes nicht korrekt zählst, sollte doch ein einfach zu behebender Fehler sein.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@timm4444: Was genau verstehst du denn nicht? Es gibt ja eine Funktion, die brauch die Parameter "index" und "max_index". Und max_index darf natürlich nicht größer sein als die Anzahl der Bilder, die in dem animated Gif stecken. Und wenn das Ding in einer Dauerschleife laufen soll, dann musst du den Index - also das Bild, das gerade angezeigt wird, natürlich nach dem letzten Bild wieder auf 0 setzen.
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

@sparrow: Danke, jetzt habe ich es verstanden. :-) :-)
Antworten