Anzeigen von Bildern in Labels mit einer for-Anweisung mit tkinter, kann es getan werden? - Python, Bild, For-Schleife, Tkinter, Label

Ich versuche, eine zufällige Reihe von Bildern zu bekommenSeite an Seite drucken; Das Problem ist, dass wenn ich den folgenden Code ausführe, es nur eine Gruppe leerer leerer Etiketten erzeugt. Wenn ich "image = pic" durch einen "text =" was auch immer "" ersetze, funktioniert es gut (was beweist, dass es tatsächlich das Etikett erzeugt). Platzieren Sie das Label und das Bild woanders, funktioniert gut (beweist, dass es nicht die Bilder sind), auch wenn ich "pic = PhotoImage (file = w [0])" benutze (also denke ich nicht, dass es meine Methode ist) ...

from tkinter import *
from tkinter import ttk
import random

root = Tk()
root.title("RandomizedPic")

def randp(*args):
w = ["wb.gif", "wc.gif", "wd.gif", "we.gif"]
random.shuffle(w)
am = 1

for i in w:
pic = PhotoImage(file=i)
ttk.Label(mainframe, image=pic).grid(column=am, row=0, sticky=(W, E))
am+=1


mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

ttk.Button(mainframe, text="Do it", command=randp).grid(column=0, row=0, sticky=W)

root.bind("<Return>", randp)
root.mainloop()

Jeder Ratschlag, wie man dies zur Arbeit bringt, wird sehr geschätzt.

Antworten:

4 für die Antwort № 1

Dies ist ein bekanntes Problem mit Tkinter - SieMUSS deine eigene Referenz auf alle Photobilder behalten, sonst wird Python sie sammeln - das ist was mit deinen Bildern passiert. Wenn Sie sie nur als Bild für ein Label festlegen, wird dies nicht zum Referenzzähler für die Bildobjekte hinzugefügt.

LÖSUNG:

Um dieses Problem zu lösen, benötigen Sie einen persistentenReferenz auf alle von Ihnen erstellten Bildobjekte. Idealerweise wäre dies eine Datenstruktur in einem Klassennamespace. Da Sie jedoch keine Klassen verwenden, muss eine Liste auf Modulebene ausgeführt werden:

pics = [None, None, None, None]   #  This will be the list that will hold a reference to each of your PhotoImages.

def randp(*args):
w = ["wb.gif", "wc.gif", "wd.gif", "we.gif"]
random.shuffle(w)
am = 1

for k, i in enumerate(w):    # Enumerate provides an index for the pics list.
pic = PhotoImage(file=i)
pics[k] = pic      # Keep a reference to the PhotoImage in the list, so your PhotoImage does not get garbage-collected.
ttk.Label(mainframe, image=pic).grid(column=am, row=0, sticky=(W, E))
am+=1

Speisekarte