@Sirius3: Das geht natürlich aus zwei Gründen nicht. Hier lädst Du ein Photoimage. Dann hängst Du, den Filenamen dran. Könnte gehen, wenn das ein Objekt ist. Aber dann gibst Du den Filenamen zurück und wirfst das Photoimage weg. Das macht jetzt wenig Sinn. Naja, mann könnte es dann ja bei der Übergabe durch image=someimage nochmals neu aus dem Filenamen laden.
Aber der zweite Grund ist der Wichtigste. Ich hatte schon einmal eine Funktion, mit der ein Photoimage geladen wurde. Doch der Anwender soll keine vom normalen tkinter abweichende Funktion brauchen, sondern es in der gewohnte Weise handhaben können also wie in Zeile 8 und 9.
Eine Möglichkeit wäre schon, daß man nun jedes Photoimage in etwas anderes umwandelt, etwa ein Tuple aus Photoimage und Namen. Das wäre aber eine gewagte Änderung, die ich mir ja mal durch den Kopf gehen lassen kann.
Die jetzige relativ frische Lösung arbeitet mit zwei globalen Variablen. Eine davon kann man unbedenklich beseitigen, nämlich was
Image.open('Images/Blumeklein.jpg') zurückliefert.
Zur Zeit liefert diese Funktion ein PIL image zurück und speichert den Filenamen in einer globalen Variablen, aus der sich dann ein bald nachfolgendes ImageTk.Photoimage den Namen abholt. Da müßte man mal schauen, ob man mit so einem PIL Image noch etwas anderes machen will, außer es lediglich an ImageTk.Photoimage zu übergeben.
Und dann gibt es eine zweite globale Variable, nämlich ein Dictionary mit key ein tkinter Photoimage und als Wert den Filenamen. Das muss man sich gründlicher überlegen, ob man das erwartete tkinter Photoimage in etwas anderes umwandelt. Sollte ich irgend etwas vergessen haben, habe ich eben Pech gehabt und bekomme den Filenamen nicht, aber wichtig ist, dass dann trotzdem das tkinter PhotoImage funktioniert.
Also die jetzige Lösung ist so:
So bindet der Anwender mein Image und ImageTk ein:
Code: Alles auswählen
import DynTkInter as tk
from DynTkInter import Image,ImageTk
Und so binde ich das dann in DynTkInter ein:
Code: Alles auswählen
import dyntkinter.DynTkPil as Image
import dyntkinter.DynTkPil as ImageTk
Und dort sieht man die globalen Variablen:
Code: Alles auswählen
from PIL import Image as Pil_Image
from PIL import ImageTk as Pil_ImageTk
def open(filename):
global Pil_Imagefile
Pil_Imagefile = filename
return Pil_Image.open(filename)
def PhotoImage(pil_image):
image = Pil_ImageTk.PhotoImage(pil_image)
_image_dictionary[image] = Pil_Imagefile
return image
def init(image_dict):
global _image_dictionary
_image_dictionary = image_dict
Das mit Pil_Imagefile mache ich wohl besser weg, weil das sowieso nicht funktionieren würde, wenn jemand zuerst mehrere PIL images speichert und erst danach mit ImageTkPhotoImage daraus tkinter PhotoImages macht.
Das Dictionary wegmachen und aus dem tkinter PhotoImage etwas anderes machen, wäre ein Änderung mit weitreichenden globalen Folgen, nur um eine globale Variable wegzumachen. Das muss gut überlegt werden.
Es könnte sich ja jemand das PhotoImage wieder aus somelabel['image'] holen und es dann anders nochmals weiterverwenden. Da müßte ich auch so etwas kontrollieren anstatt es einfach tkinter zu überlassen. Da müßte ich also dann das gewandelte PhotoImage im Widget speichern und dann alles damit kontrollieren.