Bildervorschau, nur letztes Bild wird angezeigt.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
VolkerH
User
Beiträge: 20
Registriert: Dienstag 24. September 2013, 07:16
Wohnort: 46499 Hamminkeln

Hallo zusammen,
ich bin neu hier im Forum, mit Python habe ich erst die ersten Erfahrungen gemacht und hänge an einem Punkt, der mich sehr beschäftigt. Ich habe auch schon gegoogelt, aber die Lösung für mein Problem war nicht zu finden.
Ich möchte eine Bildervorschau umsetzen, die Bilder eines Verzeichnisses auflistet. Für den Test habe ich zwei Bilder im Ordner und im Folgenden ist mein Script zu sehen:

Code: Alles auswählen

for i in range(1,3):
    img_name = "IMG_540"+str(i)+"_mini.jpg"
    main.pic=Image.open(img_name)
    main.obj_pic=ImageTk.PhotoImage(main.pic) 
    pic_Width = main.obj_pic.width()
    pic_Height = main.obj_pic.height()
    
    bild = tkinter.Button(frm_Frame, image=main.obj_pic, width=pic_Width, height=pic_Height, command=ShowInfo)  
    bild.place(x=xpos, y=0)
    xpos += pic_Width
    
    frm_Frame.update()
#    frm_Frame.after(3000)
Der Ablauf findet in einer Schleife statt, wegen der späteren nicht bekannten Anzahl von möglichen Bildern. Als Ergebnis hat das Frame zwei Buttons, aber nur der letztere hat das Bild.
Wenn die Pause eingesetzt wird, dann sieht man schon, dass beim ersten Durchlauf das erste Bild angezeigt wird.
In einem Script ohne Schleife und zwei festen Zuweisungen funzt es gut... aber ist halt zu statisch ;-)
Ich denke das der Fehler irgendwo bei der Instanziierung des Bildes liegt, dieses wird quasi nicht wirklich "übergeben" an den Button, oder?
Ich freue mich über jeden Tipp bzw. Verbesserung des Scripts.

Danke und viele Grüße,
Volker
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Der Grund ist ganz einfach: Tkinter kümmert sich nicht um den Referenzzähler der Bilder. Das heißt, wenn du die Bilder nicht irgendwo noch selber in einer Liste speicherst, dann werden sie vom Garbage-Collector gelöscht und könnten nicht mehr angezeigt werden. Du kannst also entweder selber eine Liste mit den Bildern speichern, oder du erweiterst den Button einfach.

Es wäre aber vielleicht eine gute Idee, wenn du deinen Code hier postest. Der sieht, vorsichtig gesagt, nicht besonders gelungen aus. Dann bekommst du hier sicher eine Menge Hinweise und Verbesserungsvorschläge.
Das Leben ist wie ein Tennisball.
BlackJack

@VolkerH: Du musst die `ImageTk.PhotoImage`-Objekte behalten, das heisst es muss in Python noch eine Referenz darauf bestehen. Da Du die alle an das Attribut `main.obj_pic` bindest, bleibt letzendlich nur das letzte erreichbar weil jede Zuweisung die Referenz auf das vorherige Bild ersetzt. Man könnte die Bild-Objekte zum Beispiel in einer Liste sammeln.

Die Namen und die Formatierung halten sich nicht alle an den Style Guide for Python Code.

Werte und Zeichenketten mit ``+`` und `str()` zusammensetzen ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode oder dem ``%``-Operator auf Zeichenketten.

Der `update()`-Aufruf sollte eigentlich nicht notwendig sein.
VolkerH
User
Beiträge: 20
Registriert: Dienstag 24. September 2013, 07:16
Wohnort: 46499 Hamminkeln

Hi EyDu, hi BlackJack,

vielen Dank für die Tipps und den Hinweis zum Code allgemein. Ich werde mir das auf jeden Fall anschauen und meinen Code verbessern. Dennoch möchte ich aber erst den Hauptkern meiner Frage lösen. Per Liste die Bilder vorhalten und dem Button den Verweis geben, werde ich versuchen.
@EyDu: Wie ist das genau gemeint mit "du erweiterst den Button"? Kannst Du mir eine Beschreibung oder Beispiel dazu geben?
BlackJack

@VolkerH: Es war eine eigene Klasse gemeint, die von `Button` abgeleitet wird. Dann kannst Du die Referenz auf das Bild im Button selbst speichern. Allerdings musst Du dann natürlich auch die `Button`-Objekte aufheben, sonst bekommt man das selbe Problem wieder bloss indirekt. :-)
VolkerH
User
Beiträge: 20
Registriert: Dienstag 24. September 2013, 07:16
Wohnort: 46499 Hamminkeln

@BlackJack: So etwas in diese Richtung habe ich mir schon gedacht, werde die Umsetzung erst am WE angehen können. Das mit den Button-Objekten muss ich mal schauen wie ich das mache... :wink:

Danke nochmals für die Einträge und Hilfe, auch an alle Leser und Interessierten.
Antworten