Отображение фотографий в ярлыках с помощью инструкции for с помощью tkinter, можно ли это сделать?

Я пытаюсь получить случайный кучу изображений для печати рядом друг с другом; проблема в том, что если я запустил следующий код, все, что происходит, это то, что он создает группу пустых пустых меток. Если я заменю «image = pic» на «text =« whatever », он отлично работает (таким образом, доказывая, что он фактически создает ярлык). Размещение ярлыка и изображения в другом месте отлично работает (доказывая, что это не изображения), даже если я использую «pic = PhotoImage (file = w [0])», он работает (поэтому я не думаю, что это мой метод). ,

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() 

Любые советы о том, как заставить это работать, будут высоко оценены.

Это известная проблема с tkinter – вы ДОЛЖНЫ сохранить свою собственную ссылку на все фотоизображения, иначе python будет собирать мусор – вот что происходит с вашими изображениями. Просто устанавливая их как изображение для метки, НЕ добавляйте к счету ссылок для объектов изображения.

РЕШЕНИЕ:

Чтобы решить эту проблему, вам понадобится постоянная ссылка на все создаваемые объекты изображения. В идеальном случае это будет структура данных в пространстве имен классов, но поскольку вы не используете какие-либо классы, вам потребуется сделать список модулей:

 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