ich möchte in einem Canvas eine kleine Animation erstellen. Ich habe dafür eine "Wiese" aus vielen Ovalen erzeugt, auf welcher ein Bild platziert wird. Jetzt will ich in die Szene hineinzoomen. Für die Ovale geht das ziemlich einfach mit canvas.scale(), um das Bild zu skalieren habe ich jeweils das Originalbild mit neu skaliert und mit dem vorherigen Bild ersetzt (siehe Code).
Problem: bei meinem (recht leistungsschwachen) Computer komme ich damit nur auf etwa 6 Frames pro Sekunde. Gibt es noch etwas, das ich optimieren könnte, um es etwa 4 mal so schnell zu bekommen?
Alternativ könnte ich mir auch vorstellen erst alle in der Größe angepassten Bilder als Liste zu speichern und dann immer nur das Bild zu ersetzen, und man könnte natürlich wie bei "professionellen" Animationen das ganze nicht live, sondern als Video ausgeben lassen. Diese Möglichkeiten wären für mich aber erst mal zweite Wahl.
Hier mein Code:
Code: Alles auswählen
#Hier den Dateipfad des Bildes angeben
path="/pfad/zum/ordner/vom/bild/"
from tkinter import *
from random import randint
from PIL import Image, ImageTk
from time import sleep,time
#Erzeugt einen Canvas im Fullscreen
root=Tk()
width=root.winfo_screenwidth()
height=root.winfo_screenheight()
root.geometry(str(width)+"x"+str(height)+"+0+0")
canvas=Canvas(root, width=width,height=height)
canvas.pack()
#Generiert eine "Wiese"
ovals=100
for i in range(ovals):
x0 = randint(int(-width*0.15), width)
y0 = randint(int(height*0.8),int(height*0.9))+height*0.1*(i/ovals)
x1= x0+randint(int(width*0.05),int(width*0.3))
y1 = y0+randint(height//10,height//5)
g=i*(100//ovals)+155
canvas.create_oval(x0,y0,x1,y1,outline="",fill="#%02x%02x%02x" %(50,g,50))
#zeigt ein Bild
image_raw = Image.open(path+"xxxxxxx.png")#hier Bild einfügen
image_size=(72,128)#hier Startgröße angeben
image=image_raw.resize(image_size,Image.NEAREST)
photo = ImageTk.PhotoImage(image)
image_id = canvas.create_image(width/2, height*0.7, image=photo, anchor=NW)
root.update()
fps=canvas.create_text(150,150,text=0)
sleep(2)
stime=time()
zoom_factor=1.01
frames=0
while True:
#Skaliert die Ovale, verschiebt x0/y0 vom Bild
canvas.scale("all",width/2,height*0.85,zoom_factor,zoom_factor)
image_size=[i*zoom_factor for i in image_size]
normed=[int(i) for i in image_size] #.resize benötigt Integer
image=image_raw.resize(normed,Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)
canvas.itemconfig(image_id,image=photo)
#FPS-Zähler
frames+=1
if frames==10:
frames=0
canvas.itemconfig(fps,text=int(1/(time()-stime)*10))
stime=time()
canvas.coords(fps,150,150)
root.update()