При работе с изображениями в Tkinter важно учитывать сборщик мусора, потому что изображения удаляются при сборке мусора, если объявить их в качестве локальных переменных. 2
Это происходит, когда при выходе из функции локальный объект удаляется сборщиком мусора, поскольку Python не знает, что он используется внутри Tk. 1
Чтобы избежать этого, нужно сохранять ссылку на каждый объект PhotoImage до тех пор, пока окно, где он показывается, не закрыто. 2 Например, можно объявить глобальный объект и хранить все картинки в нём. 1
Также можно использовать правило, что в Python любой объект хранится в памяти до тех пор, пока на него указывает хотя бы одна переменная. 4 Тогда сборщик мусора сам освободит память, увидев, что на объект не осталось ссылок. 4