我试图通过TKinter循环创建多个按钮,但是当我运行脚本时,会创建5个类似按钮的对象,但只有最后一个表现为按钮。使用TKimage,我试图覆盖一张图片来从每个按钮上的字典中的URL。但字典中包含5个图像,只有最后一个按钮变成了一个实际按钮,并且最后有5个图像。
这是我的代码:
film = films_dict['filmsoptv']["film"] #<<<< voor plaatjes films in TkinterGUI
Buttons = ['Button1','Button2','Button3','Button4','Button5']
lijstnummers = [1,2,3,4,5]
for film, i, j in zip((films_dict['filmsoptv']["film"]),(lijstnummers),(Buttons)):
image_bytes = urlopen(film["cover"]).read()
data_stream = io.BytesIO(image_bytes)
pil_image = Image.open(data_stream)
tk_image = ImageTk.PhotoImage(pil_image)
j = Button(window,command=close,height=296,width=200,image=tk_image)
j.grid(row=0, column=i)
films_dict包含5个子词典,我通过在for循环中调用它来浏览以访问子词典的cover-url。 films_dict每天都在变化,所以我无法使用被动网址。
任何可以帮我创建5个按钮而不是一个按钮的人?
答案 0 :(得分:1)
只是一个猜测,但我认为除了最后一张图像之外的所有图像都是garbage collected,因为只有对最后一张图像的引用(tk_image
仍然指向循环后的那张图像)。由于某种原因,在Button或Label中使用的图像不算作垃圾收集器的参考。尝试在列表或字典中存储对所有图像的引用,然后它应该可以工作。
此外,您似乎希望将Button添加到列表Buttons
,方法是将其分配给j
。但这不起作用。最好将Buttons
初始化为空列表,并将append
新按钮初始化为该列表。试试这个(未经测试):
images = []
buttons = []
for i, film in enumerate(films_dict['filmsoptv']["film"], 1):
image_bytes = urlopen(film["cover"]).read()
data_stream = io.BytesIO(image_bytes)
pil_image = Image.open(data_stream)
tk_image = ImageTk.PhotoImage(pil_image)
j = Button(window, command=close, height=296, width=200, image=tk_image)
j.grid(row=0, column=i)
images.append(tk_image)
buttons.append(j)