无法通过tkinter创建for循环按钮。 (蟒蛇)

时间:2015-10-14 10:32:44

标签: python button for-loop dictionary tkinter

我试图通过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个按钮而不是一个按钮的人?

1 个答案:

答案 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)
相关问题