在通过tkinter创建带有for循环的按钮时遇到麻烦.(Python)



我试图通过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每天都在变化,所以我不能使用被动url。

谁能帮我创建5个按钮而不是一个?

只是猜测,但我认为除了最后一个图像之外的所有图像都是垃圾收集,因为只有对最后一个图像的引用(tk_image仍然指向循环后的那个图像)。由于某些原因,Button或Label中使用的图像不算作垃圾收集器的引用。尝试在列表或字典中存储对所有图像的引用,然后应该可以工作。

此外,似乎您想通过将按钮分配给j来将其添加到列表Buttons中。但这行不通。最好将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)

相关内容

最新更新