tkinter как зацикливать кнопки

#python #loops #tkinter

#python #циклы #tkinter

Вопрос:

 for i in champs:
    
    img  = tkinter.PhotoImage(file = r"D:Στοιχεια Ληψης{}.png".format(i))
    l1 = tkinter.Label(text=i,bg=bgcolour,fg="White",font = (("Courier", 15)))
    l1.place(x= xaxes,y=270)
    xaxes = xaxes   200
    

    button = tkinter.Button(bg=bgcolour,text=i ,image =img, bd="0",     
    activebackground = "#00003f", height = "200", width = "200")
    button.place(x = x1, y = 60)
    x1 = x1   100   
  

Champs — это список, содержащий некоторые имена
Когда я запускаю код в своем окне, я получаю только последнюю кнопку (изображение)
Почему это?
Я пытаюсь создать цикл, в котором некоторые кнопки будут располагаться рядом друг с другом

Комментарии:

1. Вам нужно сохранить ссылку. effbot.org/tkinterbook/photoimage.htm

2. Изображения собираются как мусор, даже когда используются в ярлыке. Сохраните их в некотором списке, который остается в области видимости.

3. использование after функции действительно поможет.

4. Попробуйте button.image = img ?

5. Существует известная проблема с изображениями tkinter, когда они удаляются («собирается мусор») после запуска — вам нужно сохранить ссылку на ваши разные изображения, например, в списке или словаре, а затем получить доступ к изображению через этот список / словарь

Ответ №1:

Ваши изображения собираются мусором. Вот решение.

 import ntpath
import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()
root.geometry("800x600")

#for storing image references
images   = dict()

#list of your image paths
pathlist = ['D:image1.png', 'D:image2.png']

#load paths and save references
for path in pathlist:
   name         = ntpath.basename(path).split('.')[0]
   images[name] = ImageTk.PhotoImage(Image.open(path), name=name)

   
#you can assign an image with just the name
labela = tk.Label(root, image='image1')
labela.grid()

#or directly through the images reference
labelb = tk.Label(root, image=images['image2'])
labelb.grid()

root.mainloop()