Seite 1 von 1

Bildervorschau, nur letztes Bild wird angezeigt.

Verfasst: Mittwoch 25. September 2013, 11:24
von VolkerH
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

Re: Bildervorschau, nur letztes Bild wird angezeigt.

Verfasst: Mittwoch 25. September 2013, 11:42
von EyDu
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.

Re: Bildervorschau, nur letztes Bild wird angezeigt.

Verfasst: Mittwoch 25. September 2013, 11:47
von 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.

Re: Bildervorschau, nur letztes Bild wird angezeigt.

Verfasst: Mittwoch 25. September 2013, 13:41
von VolkerH
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?

Re: Bildervorschau, nur letztes Bild wird angezeigt.

Verfasst: Mittwoch 25. September 2013, 15:15
von 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. :-)

Re: Bildervorschau, nur letztes Bild wird angezeigt.

Verfasst: Donnerstag 26. September 2013, 09:27
von VolkerH
@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.