1

is there a way how to create buttons each with unique images and identities using loop? I came up with the code below but only button that works and has its image is the last one:

import tkinter as tk
from tkinter import *
from functools import partial

win = tk.Tk()
win.geometry('800x500')  # set window size

dic = {0: {"row": 0, "col": 0 }, 1: {"row": 1, "col": 0 }, 2: {"row": 2, "col": 0 }}

chairImg, chair2Img, checkImg = None, None, None

fileList = [chairImg, chair2Img, checkImg]
imgList = ['chair.png', 'chair2.png', 'check.png']
buttonIdentities = []
i=0

def checkButton(n):
    # function to get the index and the identity (bname)
    print(n)
    bname = (buttonIdentities[n])

for img, f in zip(imgList, fileList):
    f = PhotoImage(file=img)
    f = f.zoom(16).subsample(256)
    
    button = Button(win, image=f, command=partial(checkButton, i))
    button.grid(row=dic[i]['row'], column=dic[i]['col'])
    buttonIdentities.append(button)
    i+=1   

print(button_identities)
win.mainloop()

I'd love to simplify my code because I'm gonna be using a lot more buttons and images in my app. Thank you for your time and answers.

1 Answer 1

1

It looks like the images are getting lost because of garbage collection. To avoid this, just add a reference to the image, like this:

button = Button(win, image=f, command=partial(checkButton, i))
button.image = f #This line here.
button.grid(row=dic[i]['row'], column=dic[i]['col'])

(It doesn't have to be .image, it can be anything)
By keeping a reference to the image, it doesn't get garbage collected. You can read more about it here.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.