0

When i try to create buttons in a grid using a function (new_btn(r,c,btn)), the image on them gets removed and i cant click them exept for the last one. Its a 9*9 grid.

I tried it using loops but then i was not able to set the row an colum of the button, this is important because later on in this project only one button should have the image on.

def new_btn(r,c,btn):
    global photo
    # Create Buttons
    
    btn_1.update()
    print(btn)
    btn = Button(root, image=get_img(btn_1),)
    
    print(btn.winfo_height())
    btn.grid(row=r,column=c,sticky="NESW")
    return btn

btn_1 = Button(root,text="Button 1",)
btn_1.grid(row=0,column=0)
button_1 =  new_btn(0,0,"1")
button_2 =  new_btn(0,1,"2")
button_3 =  new_btn(0,2,"3")
button_4 =  new_btn(1,0,"4")
button_5 =  new_btn(1,1,"5")
button_6 =  new_btn(1,2,"6")
button_7 =  new_btn(2,0,"7")
button_8 =  new_btn(2,1,"8")
button_9 =  new_btn(2,2,"9")

def get_img(button):
    global resize_image
    global photo
    global abs_file_path
    img = Image.open(abs_file_path)

    resize_image = img.resize((button.winfo_height(), button.winfo_height()))
    photo = ImageTk.PhotoImage(resize_image)
    return photo

the get_image function just creates the file path to the image and sets its size to the size of the button. Note that in my code the get_img is above the other function if that is even relevant. The variable abs_file_path is created before it is just the path to the image.

QRY78
  • 3
  • 2

1 Answers1

0

Since you have used same global variable photo to store the image inside get_img(), so only the image of the last button will be shown because the other images are garbage collected due to no variable referencing them.

You need to save the reference of the image for all the buttons by using an attribute of those buttons:

def new_btn(r, c, btn):
    ...
    image = get_img(btn_1)
    btn = Button(root, image=image)
    btn.image = image # save the reference of image using an attribute of the button
    ...
acw1668
  • 40,144
  • 5
  • 22
  • 34
  • Thanks a lot. But now if i want to resize the image on the button I cant access btn.image it says : "AttributeError: 'Button' object has no attribute 'image' " – QRY78 Mar 31 '23 at 13:55
  • It is better to raise another question on that. – acw1668 Mar 31 '23 at 14:51