Images on Dynamically Generated Buttons Glitch
MRAB
python at mrabarnett.plus.com
Sun Jul 7 15:10:28 EDT 2019
On 2019-07-07 19:28, Abdur-Rahmaan Janhangeer wrote:
> Greetings, i have this snippet:
> ---
> import json
> import os
> from tkinter import *
> from tkinter.ttk import *
>
> root = Tk()
> jload = json.load
> buttons = list()
> programs = os.listdir('programs')
> for i, program in enumerate(programs):
> jsonpath = 'programs/{}/cmdlaunch.json'.format(program)
> info = jload(open(jsonpath))
> photo = PhotoImage(file = 'icons/'+info['icon'])
> photoimage = photo.subsample(3, 3)
> buttons.append(Button(root, text = 'Click Me !', image = photoimage,
> compound = LEFT))
> buttons[-1].pack()
>
> root.mainloop()
> ---
>
> All buttons are appearing but only the last button is displaying the image,
> any idea?
>
You need to keep a reference to the image that you passed when creating
the button; tkinter itself doesn't keep a reference to it:
import json
import os
from tkinter import *
from tkinter.ttk import *
root = Tk()
jload = json.load
buttons = list()
images = []
programs = os.listdir('programs')
for i, program in enumerate(programs):
jsonpath = 'programs/{}/cmdlaunch.json'.format(program)
info = jload(open(jsonpath))
photo = PhotoImage(file = 'icons/'+info['icon'])
photoimage = photo.subsample(3, 3)
buttons.append(Button(root, text = 'Click Me !', image = photoimage,
compound = LEFT))
buttons[-1].pack()
images.append(photoimage)
root.mainloop()
In your code, 'photoimage' still refers to the last image, but there are
no references to the previous images, so they're discarded.
(Why is tkinter like that? Who knows! :-))
More information about the Python-list
mailing list