Mostrando fotos en tags con una statement for usando tkinter, ¿se puede hacer?

Estoy tratando de obtener un montón de fotos al azar para imprimir lado a lado; el problema es que si ejecuto el siguiente código, todo lo que sucede es que crea un grupo de tags vacías en blanco. Si sustituyo la ‘imagen = pic’ con un ‘texto =’ lo que sea ”, funciona bien (lo que demuestra que realmente crea la etiqueta). Colocar la etiqueta y la imagen en cualquier otro lugar funciona bien (demostrando que no son las imágenes), incluso si uso ‘pic = PhotoImage (archivo = w [0])’ funciona (así que no creo que sea mi método) .. .

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('', randp) root.mainloop() 

Cualquier consejo sobre cómo hacer que esto funcione será muy apreciado.

Este es un problema bien conocido con tkinter: DEBE mantener su propia referencia a todas las Imágenes de foto, de lo contrario Python las recogerá, eso es lo que está sucediendo con sus imágenes. El simple hecho de establecerlos como la imagen para una etiqueta NO se agrega al conteo de referencia para los objetos de imagen.

SOLUCIÓN:

Para resolver este problema, necesitará una referencia permanente a todos los objetos de imagen que cree. Idealmente, esto sería una estructura de datos en un espacio de nombres de clase, pero como no estás usando ninguna clase, una lista a nivel de módulo tendrá que hacerlo:

 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