Animierter Hintergrund

Fragen zu Tkinter.
Antworten
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Halo,

Ich probiere grade einen animierten Hintergrund für ein Canvas zu erstellen.
Die Animation besteht bisher nur aus 2 Bilde.

Code: Alles auswählen

def hin():
    if f.itemcget(asd, "image") == str(hintergrund[0]):
        f.itemconfigure(asd, image = hintergrund[1])
    else:
        f.itemconfigure(asd, image = hintergrund[0])
    f.after(10, hin)
 
       
hintergrund = []
hintergrund.append(PhotoImage(file = "D:\\Stratege\\hintergrund 2.gif"))
hintergrund.append(PhotoImage(file = "D:\\Stratege\\hintergrund 1.gif"))

f = Canvas(fenster, width = 1200, height = 1000, bg = "white")
f.pack()
asd = f.create_image(0, 0 , image = hintergrund[0], anchor = NW)
Mein Problem ist, das der CPU bei einem Bild dieser Größe zu sehr ausgelastet wird.
Hat vielleicht jemand eine Idee wie man das machen könnte?

danke im voraus für alle antworten
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Naja, das wird sich auch nicht ändern, mal abgesehen davon, das Tkinter nie besonders schnell war, hast du noch das Problem, dass du alle 10ms es wechselst.
Mit anderen Worten du hast eine HD-Qualität mit einer Aktualisierunggeschwindigkeit von 100 hoch aufgelösten Bildern pro Sekunde, das macht kaum ein CPU mit.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Nun, es ist mir klar das es so nicht funktioniert, :|
deshalb frag ich ja wie man es besser machen könnte.

Eventuell ein Video einbinden?

Ich möchte ein Menü erstellen, wo man im Hintergrund ein Video hat
und sich im Vordergrund Buttons befinden (so wie man es aus vielen Spielmenüs kennt)

vielleicht sind meine Anforderungen an Tkinter zu hoch?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ja, die Anforderungen sind zu hoch für Tkinter und warscheinlich auch für jede andere GUI.
Habe ich mich so Missverständlich ausgedrückt ?

HD = 1920 x 1080, also 2073600 Bildpunkte, im Zeilensprungverfahren, und 30 Vollbilder pro Sekunde
Du = 1200 x 1000, also 1200000 Bildpunkte, komplett, und 100 Vollbilder pro Sekunde

Du hast zwar nur die Hälfte der Bildpunkte wie bei HD, hast aber weder ein cleveres Verfahren zum Aktualisieren noch ist deine Datenrate geringer, da du 3x so oft aktualisierst. Logische Schlußfolgerung, wenn es schon in den meisten Video Playern Probleme mit HD gibt, wieso sollte eine noch höhere Last von Tkinter bewältigt werden können ?
Dreh also die Aktualisierung runter und möglichst noch die Auflösung, dennoch ist Qt sicher besser dafür geeignet.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Hallo.

Nein du hast dich nicht Missverständlich ausgedrückt, eher ich.

Ich meinte ja eigentlich nicht das es mit 100 Bildern in der Sekunde gehen soll, nur sollte es sauber und ohne ruckeln des Bildes laufen.
ich probiere halt grade rum und hab meinen Code einfach mal rein kopiert.

würde es vielleicht gehen es über ein 3d Fenster zu machen?

also einfach das Blender -modell zu benutzen und die Animation in Echtzeit zu berechnen.

Wie wird den normalerweise z.b. In einem Spiel ein Weltall mit über dem Bildschirm fliegenden Partikeln dargestellt? (über Partikel?)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ich weiß jetzt nicht, warum oder woher du jetzt Blender nimmst - denn das nun gar nichts mit Tkinter zu tun, aber ich habe dir mal ein Beispiel zusammen gestellt. - und Echtzeit berechnungen fressen noch viel mehr.
Teste deine Bilder mal so, ich habe einen kleinen Frame gebastelt, die Aktualisierungsrate auf 25 fps runter gedreht und gleich den gesamten Ordner Ausgelesen.

Code: Alles auswählen

import Tkinter as tkinter
import os

class ImageSwitcher(tkinter.Canvas):

    def __init__(self, master, images=[], cnf={}):
        tkinter.Canvas.__init__(self, master, cnf)
        self.images = images
        self.index = 0
        self.item = self.create_image(0, 0, image=self.images[0], anchor="nw")

    def switch_image(self):
        self.itemconfigure(self.item, image=self.images[self.index])
        self.index = self.index + 1 if self.index < len(self.images) - 1 else 0
        self.update()
        self.after(40, self.switch_image)
    
if __name__ == "__main__":
    path = "D:\\Stratege"
    root = tkinter.Tk()
    
    images = [tkinter.PhotoImage(file=os.path.join(path, pic)) for pic in \
              os.listdir(path) if pic.endswith(".gif")]
    
    switcher = ImageSwitcher(root, images)
    switcher.pack(expand=True, fill="both")
    switcher.switch_image()
    
    root.mainloop()
Edit:
Wie wird den normalerweise z.b. In einem Spiel ein Weltall mit über dem Bildschirm fliegenden Partikeln dargestellt? (über Partikel?)
Kommt ganz darauf an, häufig werden die Effekte auch nur vorgebacken(Blender bakes sind ja in Blender für sowas da) und dann als Bilder oder als Koordinaten eingelesen, da wird nichst mehr berechnet. Diese sind aber meist klein und nicht so Hoch aufgelöst. z.B. eine Sternen Hintergrund kann man einfach schwarz machen und dann die Sterne als 25x25 zu je 4 o. 5 Bildern zu einem schon Wirkungsvollen Sternanimation machen, dann ein paar auf dem schwarzen Hintergrund verteilen und schon hat man eine Sternen Karte. So werden auch nur die entsprechenden Bereiche neu gerendert und der Rest bleibt wie er ist.

Edit2: - automatisches Verkleinern/-größern des Canvas bei Größenänderung hinzugefügt.
Zuletzt geändert von Xynon1 am Freitag 4. Februar 2011, 11:43, insgesamt 2-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Danke :P

damit werde ich mich gleich mal beschäftigen
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Erkenbrand

Hier der Xynon1 Image-Switcher in Aktion:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import Tkinter as tkinter
import os

IMAGE_1 =\
'''
R0lGODlhNQA1AMYoAAAAAAAEAAgECAgICAgMCBAMEBAQEBAUEBgUGBgYGBgc
GCAcICAgICAkICkkKSkoKSksKTEsMTEwMTE0MTk0OTk4OTk8OUE8QUFAQUFE
QUpESkpISkpMSkpQSlJMUlJQUlJVUlpVWlpZWvAgAFpdWmJdYmJhYmJlYvAw
AGplamppamptanNtc3Nxc3N1c3t1e3t5e3t9e4N9g4OBg4OFg4uFi4uJi4uN
i5SNlJyRe5SRlJSVlJyVnJyZnJydnPCQAKSdpKShpKSlpKylrKyqrKyurLSu
tLSytLS2tL22vfDAAMW6nM26i726ve7CIL2+vcW+xcXCxebGWsXGxf/OAPbK
Me7KSv/OCP/KKf/SAM3Gzf/SGM3Kzf/OMd7OlP/WGM3OzdXO1f/WOf/WStXS
1fbaYtXW1d7W3v/eat7a3t7e3v/ie+be5ubi5v/qi+7m7u7q7vbuze7u7v/y
vfby9v/y3vb29v/2///6//////AwAPAwAPAwAPAwAPAwAPAwACH+FUNyZWF0
ZWQgd2l0aCBUaGUgR0lNUAAh+QQBCgB/ACwAAAAANQA1AAAH/oB/goOEhYaH
iIYjhIuLiY+QkYySlJWGKH8omJiOlp6PmIKhn6SHmpqZmaOlpaGbf3OssqKq
mG5UYoNKs5avqX9fVF5/SsW8va4oZVlMxMeSHkg2LWhUVFtjY1RXus+PHEl3
dGtUTlJYVV1WS86sNzIyQU1NR0c3IBUnQoInTTZ0dsRQyTHjSaFdpEi0aJMn
jx06cN6oSUMmigkACULokHGhCZ06ce6oEPSj3ScSM+TkwXNHDpw2bMyQ4aLl
SRMWA0h8mAAAwL+HTVzI8tGBYR5xEdlQDKMlSpMkRohYeHBAQE8AEmw0ITGy
FAkcK1u+ZHNmphYo9IwMCdKjxNW3/j0bsCIBxCFEiUunOE1ShEgQIDt02GgA
t+cAViuIiIUpk6bNI0aEsOVxw8YMGRYKAxBKykePuxPJhNH7tO/fwDZqyIDR
okJhA6xAvFTTuGZayT0oW5bxwsUKFRI0c0h4JjQY0nz9AhZcIwZrFidMiEig
GQApFrUfR55c+bKLFipSkBDxYUN1ABA8kYgyeq/p5amdt2CRQnoIDxseWK3u
ycKUx0XgtkN3MnwXXgnkeaABBhUMcB4AGFRyAwtNIGGaD6jRIB909nGwAQYX
TLAAAAEAYFWJbx1GyQwzBMjdbgaKl2AGDFIAAWEP9mTDijIA0YMOOMT3XHQi
hOAhiBNI/vCAAwGUeKKJJL5VCQAkDGhZDDGO94EHNFZg4wMMKIBijgBYQAkA
FNSgIWsrEGnkhyEq6YACCDQJpZNRWrXfA2cO0Bt4Mm7Z5ZcMLHBAAWSaGIBV
fEoSF4dFHhnnkgokUICDeGYK5QADGOBgo5FcxcAHH3DQ5QQQgKnAAQaMeV6T
AxBgwAEIAAAqJClGYIEFST7QAJ0EOPjksHkOUIABCCSwAHW3PqJZrJzamSgA
nBpgQAIJMNDAiGZKQkB1mhKLpwACFFAAAggssIADD0RAXSXmTVudAMYiqywD
7EogQa2WzJvnv04GEOusCSig7QMQUECBBZz2K+9VTRZAAK0L/ijQgAMRQDBB
BRc8AEAFloAAl7h3Utvptdky8MAD+lZgAQYZ1EqDJ/IKLOsBBR8MgQQbW5BB
Bq7J5ckHhRFL77HJLoBvuxJQwDEGG0Tt4AykfHtetSgzoDLLElRQAQZQb/AB
dRmwApeTAhBAALoKrItxBApfcIEGGnjgQQgMAKCALCSMXG/SS0fQ9NMabODB
B3hTe8MsHFyVNsEGN4Awzy7DvAEHH4CQ+ABU8yLCVQUcoIDFDUAA9wQWzJ0B
B3eDoIGDsHnzh4MAFLB1y1+HTaoIHjgQl+yDZNCTAAlE0LPlmHtQgQKGAW8I
BlcZoIADki9Za0+xO39ICxMcoJnQCdqHL/745HsSCAA7
'''

IMAGE_2 =\
'''
R0lGODlhNQA1AMYoAAAAAAAEAAgECAgICAgMCBAMEBAQEBAUEBgUGBgYGBgc
GCAcICAgICAkICkkKSkoKSksKTEsMTEwMTE0MTk0OTk4OTk8OUE8QUFAQUFE
QUpESkpISkpMSkpQSlJMUlJQUlJVUlpVWlpZWvAgAFpdWmJdYmJhYmJlYvAw
AGplamppamptanNtc3Nxc3N1c3t1e3t5e3t9e4N9g4OBg4OFg4uFi4uJi4uN
i5SNlJyRe5SRlJSVlJyVnJyZnJydnKSdpKShpKSlpKylrKyqrKyurLSutLSy
tLS2tL22vfDAAMW6nM26i726ve7CIL2+vcW+xeDUEMXCxebGWsXGxf/OAPbK
Me7KSv/OCP/KKf/SAM3Gzf/SGM3Kzf/OMd7OlP/WGM3OzdXO1f/WOf/WStXS
1fbaYtXW1fDwAN7W3v/eat7a3t7e3v/ie+be5ubi5v/qi+7m7u7q7vbuze7u
7v/yvfby9v/y3vb29v/2///6//////AwAPAwAPAwAPAwAPAwACH+FUNyZWF0
ZWQgd2l0aCBUaGUgR0lNUAAh+QQBCgB/ACwAAAAANQA1AAAH/oB/goOEhYaH
iImKi4yNjo+QkZKTjGdnhyOUmoojmZuSSYJ0g5mln5Chgm9UYoKep5NQgl9U
Xih/t7ewk2VZS3+vu4keRzYtaVRUW2NjVFevmbrChBxIeHVsVE1SWFVdVkrA
nZQ3MjJATExGRjcgFSdBgidMNnV3YlQ5M04o/dC4kEi0cKNHz506ceCsUUMm
igkACULokHGBSR07cvCoEKSrU7BGJGbM0ZMHz5w4btqYIcNFixMmLAaQ+DAB
AIB6B5m4cOXJFCMfHQjquZawDcMwWqIwQVJkiIUHBwTYBCDBBhMSGzkCe0QC
B0mTKNugYanliboiQoD0KDG1rc0G/ppI/DCIUOHRKUqREBkC5McOHTYauLU5
QNOKIWBTrmz50kiRIGp53LAxQ4aFwQB2TvLRo+5CMmHwLt3b96+NGjJgtKgw
2IAmECjXLHZ5FnIPyZRlvHCxQoUEzBwmkUDzGYxovXz9Aq4RQzWLEyZEJMAM
YBKL2Y0fR55c2UULFSlIiPiwgToACJFIRAmdl7Ty081bsEgRPYSHDQ+kUo9k
YUpjIrbtwJ0M3oFXwngeaIBBBQOYBwAGj9zAAhNHkOaDaTTE91x9HGyAwQUT
LABAAABIRWJbhTkywwwAbpdbgeEhmMGCFEAgmIM22aCiDD/0oAMO8DkHnQgh
dPjhBBI8/uBAACSaWOKIbT0CAAkCUhYDjOJ94MGMFdT4AAMKnIgjABY4AgAF
NWSo2gpDFukhiEk6oAACTD7ZJJRS6feAmQPs9l2MWnLpJQMLHFDAmCUGINWe
jby1IZFGwqmkAgkU0OCdmD45wAAGNMgoI1Mx8MEHHHA5AQRfKnCAAWKax+QA
BBhwAAIAfLoIihFYYAGSDzQwJwENOiksngMUYAACCSwwna2KYAbrpnUiCsCm
BhiQQAIMNCBimY0QQF2mw94pgAAFFIAAAgss4MADEUz3SHnSUidAsccmy8C6
EkhAKyTy4ulvkwHAKmsCCmT7AAQUUGDBpvzGOxWTBRAw6wIK/jTgQAQQTFDB
BQ8AUAEkILgVrp3Tcmottgw88EC+FViAQQa00hBJvAHHegDBBkMggcYWZJAB
a3BF8sFgw85rLLIL3MuuBBRsjMEGUDc4wyTemkftyQykvLIEFVSAwdMbfDBd
Bpq41aQABBBwrgLqXhxBwhdcoIEGHngQAgMAKLAJCSLTi7TSETDttAYbePDB
3dPe8AkHU6E9cMENHLxzyy9vwMEHICA+wNSniDBVAQcoUHEDELw9gQVyZ8CB
3SBo0KBr0zQIQAFas+w12KOK4IEDb00zSAY2CZBABDxXfrkHFShAmO+GYDCV
AQo4ELmStNoEO/OHtDDBAZgFjf33B+CHL34kgQAAOw==
'''

IMAGE_3 =\
'''
R0lGODlhNQA1AMYoAAAAAAAEAAgECAgICAgMCBAMEBAQEBAUEBgUGBgYGBgc
GCAcICAgICAkICkkKSkoKSksKTEsMTEwMTE0MTk0OTk4OTk8OUE8QUFAQUFE
QUpESkpISkpMSkpQSlJMUlJQUlJVUlpVWlpZWvAgAFpdWmJdYmJhYmJlYvAw
AGplamppamptanNtc3Nxc3N1c3t1e3t5e3t9e4N9g4OBg4OFg4uFi4uJi4uN
i5SNlJyRe5SRlJSVlJyVnJyZnJydnKSdpKShpKSlpKylrKyqrKyurLSutOC4
ELSytLS2tL22vcW6nM26i726ve7CIL2+vcW+xfDQAMXCxebGWsXGxf/OAPbK
Me7KSv/OCP/KKf/SAM3Gzf/SGM3Kzf/OMfDgAN7OlP/WGM3OzdXO1f/WOf/W
StXS1fbaYtXW1d7W3v/eat7a3t7e3v/ie+be5ubi5v/qi+7m7u7q7vbuze7u
7v/yvfby9v/y3vb29v/2///6//////AwAPAwAPAwAPAwAPAwACH+FUNyZWF0
ZWQgd2l0aCBUaGUgR0lNUAAh+QQBCgB/ACwAAAAANQA1AAAH/oB/goOEhYaH
iImFKIqNjo+EKIyMkJWPk5KDjCOWnYqYf5meo4RQgpNGoad/nKSujHSSRpOu
o1Cmgm9UY4yptaSmuGBUX5mbv65mWUt/s8iPHkg2LWlUVFtkZFRXqsfPiBxJ
eHVsVE1SWFVdVkqEXqM3MjJATExHRzcgFSdBgidMNurcGUMlxwwn7li1skSi
hRs9eu7UiQNnjZoyUUwASBBCh4wLTOrYkYNHhSBTlDyRmDFHTx48c+K4aXOm
DBctTpiwGEDiwwQAAAJKZOKilo8OD/WMo9jmohgtUZgkKTLEwoMDAoACkGCD
CQmTpEjgcAlTZhs0NrU8sVdECJAe/iW0ygXawBWJHxEnVnQ6JWoSIkOA/Nih
w0aDuUAHuFoxpOzMmjdzHikS5C2PGzZmyLCAGEDRUT566LVYRkxfqYAFE7ZR
QwaMFhUQG3AFQuYayDjZVu5xObOMFy5WqJDQmcMoEmhIhzn9N/DgwjVivGZx
woSIBJ0BjGKBWzJly5g1u2ihIgUJER82ZAcAoROJKKb9pn7OWnoLFimsh/Cw
4UHW7J1YMIVkROy2Q3gyjFdeCeh5oAEGFQywHgAYVHIDC0wgkZoPq9FgH3X6
cbABBhdMsAAAAQCQVYpyKQbJDDMUCJ5vCprXYAYQUgDBYRMCZcOLMvzQgw44
1DdddSKE/iAiiRNI8IADAaS4ooooylUJACQcmFkMNZ73gQc4VqDjAwwowGKP
AFgACQAU1ODhaysgqeSIJTrpgAIIREmllFVm9d8Daw4AHHk2fhnmmAwscEAB
aKoYQFaAPkIXiEkuWeeTCiRQgIR8dkrlAAMYIGGkjmjFwAcfcBDmBBCQqcAB
Bpy5XpQDEGDAAQgAQGojLUZggQVNPtAAngRIOOWxfQ5QgAEIJLAAdrsq0lmt
oOrZKACgGmBAAgkw0MCJaj5CQHaeIsunAAIUUAACCCywgAMPRIBdJepdm50A
yjLrLAPwSiBBrpbc2+fAUgZQ660JKODtAxBQQIEFoAZsr1ZR/hZAAK4LKNCA
AxFAMEEFFzwAQAWWgDCXuXtiG+q23TLwwAP+VmABBhnkSkMn9hps6wEJLwyB
BB9bkEEGsdXVyQeIIYvvss0uwG+8ElAAMgYbVC3hDKOMu162LDPgMswSVFAB
BlRv8AF2Gbgyl5QCEEAAuwq8y3EEDl9wgQYaeOBBCAwAoEAtJJycb9NPRxD1
1Bps4MEHfGN7wy8caNU2wgo3wDDQMtO8AQcfgND4AFgjI4JWBRyggMYNQED3
BBbcnQEHe4OggYSzfSOIhAAU8HXMY5eNqggeOECX7YRkAJQACUQQtOace1CB
AokRfwgGWhmggAOWP5krULVLj0gLDhMc0JnR3pdv/vno1xIIADs=
'''

IMAGE_SEQUENCE = [IMAGE_1, IMAGE_2, IMAGE_2]

class ImageSwitcher(tkinter.Canvas):

    def __init__(self, master, images=[], cnf={}):
        tkinter.Canvas.__init__(self, master, cnf)
        self.images = images
        self.index = 0
        self.item = self.create_image(10, 10, image=self.images[0], anchor="nw")

    def switch_image(self):
        self.itemconfigure(self.item, image=self.images[self.index])
        self.index = self.index + 1 if self.index < len(self.images) - 1 else 0
        self.update()
        self.after(40, self.switch_image)
   
if __name__ == "__main__":
#    path = os.getcwd() #"D:\\Stratege"
    root = tkinter.Tk()
   
    images = [tkinter.PhotoImage(data=pic) for pic in IMAGE_SEQUENCE]
   
    switcher = ImageSwitcher(root, images)
    switcher.pack()
    switcher.switch_image()
   
    root.mainloop() 
Gruß wuf :wink:
Take it easy Mates!
Noah
User
Beiträge: 15
Registriert: Montag 17. Januar 2011, 08:20

Also ersteinmal ist die CPU-Auslastung beim HD-Bildmaterial hier als vergleich unangebracht. Denn da geht es ja um das Dekodieren des Videostreams. Hier hat er 2 Bilder, die vollständig im Speicher liegen.

Will man soetwas mit maximaler performance machen, lässt man es die Grafikkarte erledigen (Bilder in Grafik-RAM laden, und dann die 2D-Rendering funktionen der Hardware aufrufen). Das wäre denke ich jedoch overkill und nicht so portabel.

Das eigentliche Problem ist, dass man es so macht, dass intern niemals die Bilddaten kopiert werden, denn das ist das einzige, was lange dauern könnte.

In jedem Fall lesenswert:

http://de.wikipedia.org/wiki/Bit_blit
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Richtig, aber das Wrappen auf Tk-Images die dann auch noch auf dem Widget "gerendert" werden muss, dauert so gar länger als schlichtes MPEG-2 zu streamen.
Von daher, kann man gut einen Vergleich anstellen, wenn es schneller gehen soll, kann man das Image wie du ja gesagt hast auch "blitten", allerdings gibt es hierfür in Tkinter nichts, dafür müsste man dann Pygame nutzen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Noah
User
Beiträge: 15
Registriert: Montag 17. Januar 2011, 08:20

So wie ich deinen code mit dem switcher sehe, hast du es ja so gelöst, dass du die Bilder einmal in TK-Images packst und dann nur noch hin-und herschaltest. Um wie viel ist das schneller? Eine Idee wäre noch, zwei Canvas übereinanderzulegen und dann immer abwechselnd sichtbar zu machen, wahrscheinlich ist das intern aber der gleiche (minimale) Aufwand für Tkinter, wenn es gut programmiert ist.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Schneller zu was? - war doch sein ursprünglicher Ansatz, habe es nur Rund geschliffen.
Das Canvas wechseln, kann ich mir nicht vorstellen das das schneller ist (vorallem nicht bei einer größeren Anzahl an Bildern), kannst es aber mal ausprobieren. Hier habe ich mir die "Canvas"e, gespart, denn ein Canvas pro Bild, frisst Speicher, man kann auch einfach die Items tauschen.

Code: Alles auswählen

import Tkinter as tkinter
import os

class ImageSwitcher(tkinter.Canvas):

    def __init__(self, master, images=[], cnf={}):
        tkinter.Canvas.__init__(self, master, cnf)
        self.index = 0
        self.items = []
        for image in images:
             self.items.append(self.create_image(0, 0, image=image, 
                                                 anchor="nw"))

    def switch_image(self):
        self.tag_raise(self.items[self.index])
        self.index = self.index + 1 if self.index < len(self.items) - 1 else 0
        self.after(40, self.switch_image)
   
if __name__ == "__main__":
    path = "D:\\work\\"
    root = tkinter.Tk()
   
    images = [tkinter.PhotoImage(file=os.path.join(path, pic)) for pic in \
              os.listdir(path) if pic.endswith(".gif")]
   
    switcher = ImageSwitcher(root, images)
    switcher.pack(expand=True, fill="both")
    switcher.switch_image()
   
    root.mainloop()
Edit: - automatisches Verkleinern/-größern des Canvas bei Größenänderung hinzugefügt.
Zuletzt geändert von Xynon1 am Freitag 4. Februar 2011, 11:42, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Habe mal ein Testpaket mit ein paar GIF-Bildern erstellt, für den der es mal testen möchte, http://ul.to/4nkrg6.
90 Bilder 960x540, also halbe HD Größe, fürs testen sollte es aber reichen. Bevorzugte Einstellung wäre 30 fps.

Edit: Bei mir frisst das Konfigurieren des Bildes ca. 21-23% CPU Leistung das immer wieder erhöhen des Bildes 29-31% (sieht aber auch etwas Flüssiger aus). Bei 30 fps also alle 33ms ein Bild.
Aber Tkinter ist nun mal definitiv nicht für solche Lasten geeignet, denn wenn die Animation läuft, kann man auch nicht mehr viel machen, da es sonst zu abstürzen kommen kann :wink:
Edit2: Achso ich habe die Parameter width und height noch beim ImageSwitcher angegeben, denn desto größer das Canvas unabhänig der Bilder, desto mehr Performance frisst das wechseln dieser, da ein größerer Puffer aktualisiert wird, gilt nur für die tag_raise Methode.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten