2015-10-14 2 views
1

Я пытаюсь создать несколько кнопок в цикле с TKinter, но когда я запустил скрипт, создаются 5 кнопочных объектов, но только последнее ведет себя как кнопка. С TKimage im пытается наложить изображение который исходит от URL-адреса внутри словаря на каждой кнопке. Но словарь содержит 5 изображений, и только последняя кнопка превращается в настоящую кнопку и имеет окончательное из 5 изображений на ней.Проблемы с созданием кнопок с петлей через tkinter. (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 суб-словарей, которые я, назвав его в цикле, катятся через доступ к сокрытию URL суб-словаря. Film_dict меняется каждый день, поэтому я не могу использовать пассивный url.

Любой, кто может помочь мне создать 5 кнопок вместо одного?

ответ

1

Просто предположим, но я думаю, что все, кроме последнего изображения garbage collected, так как есть только ссылка на последнее изображение слева (tk_image по-прежнему указывает на тот, что после цикла). По какой-то причине изображение, используемое в Button или в Label, не считается ссылкой для сборщика мусора. Попробуйте сохранить ссылки на все изображения в списке или словаре, тогда это должно сработать.

Кроме того, кажется, что вы хотите добавить кнопку в список 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)