2015-10-14 85 views
1

我試圖通過一個循環與TKinter創建多個按鈕,但是當我運行腳本時,5個按鈕類對象被創建,但只有最後一個行爲作爲一個button.with TKimage,即時嘗試覆蓋圖片來自每個按鈕上的字典中的url。但字典包含5個圖像,只有最後一個按鈕變成了實際的按鈕,並且具有5個圖像的最後一個。無法通過tkinter for循環創建按鈕。 (Python)

這是我的代碼:

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循環,通過滾動訪問子詞典的封面的URL。 films_dict每天都在變化,所以我不能使用被動網址。

任何人可以幫助我創建5個按鈕而不是一個?

回答

1

只是一個猜測,但我認爲除最後一張圖像外都是garbage collected,因爲只有最後一張圖像的引用(tk_image仍指向循環後的那張)。出於某種原因,在Button或標籤中使用的圖像不會被視爲垃圾收集器的引用。嘗試將引用存儲到全部列表或字典中的圖像,然後它應該工作。

此外,它似乎想要將按鈕添加到列表Buttons通過將其分配給j。但這不起作用。更好地將Buttons初始化爲空列表,並將append新的Button初始化爲該列表。試試這個(未測試):

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)