Tkinter und animiertes gif

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo, liebe Raspi-Gemeinde,

    nach einiger Recherche im Forum bin ich zu dem Schluss gekommen, anstelle der PHP-Webseite zur Modellbahnsteuerung eine Steuerung per Tkinter-Fenster zu verwenden und bin damit sehr zufrieden.
    Allerdings hätte ich gerne ein animiertes gif-Bild einer Bahnhofsuhr mit im Fenster dargestellt.
    Im Prinzip habe ich das schon, aber die Animation läuft nicht.
    Ist das prinzipiell so oder gibt es da noch einen Trick?
    Vielleicht hat dafür schon jemand eine Lösung gefunden und kann mir einen Tipp geben.

    In froher Erwartung oPi Buschkin

  • Hallo,

    Tkinter kann ootb in der Tat die GIFs nicht animiert darstellen. Abhilfe: Die Frames eines animierten GIFs einzeln anzeigen lassen (dazu findet man auch bergeweise Lösungen im Netz, Suchbegriff: `tkinter display animated gif`):

    Der folgende Code zeigt einen 1-2-3 Zähler, das zugehörige GIF ist angehängt:

    [code=php]import tkinter as tk
    from itertools import cycle

    class MyApp(tk.Frame):
    def __init__(self, master=None):
    super().__init__(master)
    self.delay = 1000
    self.pack()
    self.canvas = tk.Canvas(self, width=300, height=300)
    self.canvas.pack()
    self._frames = [tk.PhotoImage(file='7_Segment_Display.gif',
    format = 'gif -index {}'.format(i))
    for i in range(0, 3)]
    self._images = cycle(self._frames)
    self.imgArea = self.canvas.create_image(0, 0, anchor = 'nw', image = next(self._images))
    self.canvas.after(1000, self._next_image)


    def _next_image(self):
    self.canvas.itemconfig(self.imgArea, image=next(self._images))
    self.canvas.after(self.delay, self._next_image)

    root = tk.Tk()
    lbl = MyApp(root)
    lbl.mainloop()[/php]

    Ob das bei einer (Bahnhofs-) Uhr mit 12*60 Frames immer noch sinnvoll ist sei dahingestellt. Es gibt auch Hinweise im Netz, dass die Methode bei großen / komplexen GIFs nicht flüssig läuft.

    Gruß, noisefloor

  • Danke für Deine Bemühungen. Ich habe mich jetzt mit Canvas beschäftigt und versuche über einem Bahnhofsuhrenzifferblatt wenigstens den Sekundenzeiger kreisen zu lassen. Im Prinzip geht das schon ein bisschen, aber der Zeiger dreht sich im Sekundentakt in mathematisch positiver Richtung.
    Hoffentlich regnet es morgen, damit ich mich in meine Canvas-Probierstube zurückziehen kann. ;)

  • Hallo Buschkin,

    meinst Du so?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (18. Oktober 2017 um 00:15)

  • Vielen Dank an noisefloor und Andreas.
    Es ist erfreulich, wie schnell man im Forum Unterstützung bekommt. Die Ideen werde ich in meinem Programm mit berücksichtigen.
    Inzwischen läuft mein Sekundenzeiger in die richtige Richtung. Nun muss ich bloß noch dafür sorgen, dass ich nach einer Minute nicht 60 Zeiger sehe.
    Entweder müsste ich kurz vor Zeigersprung den alten mit weiß drüber zeichnen oder einfach das Zifferblatt neu darstellen.
    Ob sich eine gezeichnete Linie löschen oder verschieben lässt, weiß ich noch nicht. Da bin ich noch am googeln.
    Bisher würden die Minuten- und Stundenzeiger immer still stehen.
    Ob ich die Bewegung für diese Zeiger dann auch noch hinkriege, weiß ich noch nicht.

    Herzliche Grüße
    Buschkin (der oPi)

  • Hallo Buschkin,


    Inzwischen läuft mein Sekundenzeiger in die richtige Richtung. Nun muss ich bloß noch dafür sorgen, dass ich nach einer Minute nicht 60 Zeiger sehe.
    Entweder müsste ich kurz vor Zeigersprung den alten mit weiß drüber zeichnen oder einfach das Zifferblatt neu darstellen.
    Ob sich eine gezeichnete Linie löschen oder verschieben lässt, weiß ich noch nicht. Da bin ich noch am googeln.
    Bisher würden die Minuten- und Stundenzeiger immer still stehen.
    Ob ich die Bewegung für diese Zeiger dann auch noch hinkriege, weiß ich noch nicht.

    in dem von mir verlinkten Beispiel wird der Sekundenzeiger zweimal pro Sekunde neu gezeichnet. Dies war erforderlich, nachdem sich herausgestellt hatte, dass eine Wartezeit von 1 Sekunde gelegentlich zu Sprüngen des Sekundezeigers an die übernächste Position führte. Was ja auch nachvollziehbar ist, da die Berechnung und Zeichnung des Zifernblattes und der Aktualisierung der Zeiger ja auch gewisse Zeit benötigt.

    Wieso hast Du 60 Zeiger, wenn die Minuten springen? In meinem Code mache ich es so, dass jeder Uhrzeit HH:MM:SS berechenbare Winkel für Sekunden- Minuten- und Stundenzeiger zugeordnet sind. In diese Winkel werden die Uhrzeiger gesetzt. Es ist nicht erforderlich, irgendwelche Linien zu löschen. In der Regel ist es schneller, den kreisförmigen Bereich innerhalb des Ziffernblattes zu löschen, als einen Zeiger in der der alten Position mit der Hintergrundfarbe zu übermalen, bevor die neue Position des Zeigers gezeichnet wird. Oftmals bleiben hier auch mal Fragmente übrig. Letztlich sieht das auch recht unbeholfen aus.

    In meinem Code werden dann auch die Minuten- und Stundenzeiger jede halbe Sekunde aktualisiert. Dadurch entsteht ein sehr weicher und fließender Eindruck - wie bei einer echten Analoguhr. Und bei dem zweiten Beispiel sieht man noch, dass die Zeiger in verschiedenen Höhen stehen, da die runden Teile gegenüber der Zeigerspitze sich über die langsamer bewegenden langsameren Pfeile bewegen und diese durch die runden Teile betrachtet werden können.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (7. Juni 2017 um 13:53)

  • Hallo Andreas,
    jetzt habe ich es erst mal mit springendem Sekundenzeiger realisiert. Da werde ich bestimmt noch einiges ausprobieren müssen. So schick sieht der Zeiger auch noch nicht aus.
    Spaßeshalber hänge ich mal mein Script (stark gekürzt - ohne Bilder und Buttons) mit an.



    Herzliche Grüße
    Buschkin

  • Vielen Dank für Eure Hilfe.
    Ich glaube, ich habe jetzt genug Anregungen zum Lesen und Ausprobieren.
    In meinem früheren Leben hatte ich mal mit TurboPascal zu tun. Da ist es nicht so einfach, sich in neue Programmiermethoden einzuarbeiten.
    Die nächste Modellbahnsaison für die Enkel ist aber erst im Winter, so dass ich noch etwas Zeit habe...

    Weiterhin viel Spaß wünscht
    Buschkin

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!