Tkinter (Mac, Python 2.6): изображение не отображается с помощью create_image и пункта меню

#image #canvas #menu #tkinter #invisible

#изображение #canvas #меню #tkinter #невидимо

Вопрос:

Я определил меню, в котором должно отображаться изображение (JPG, 250×250) в элементе.

 import Tkinter
from PIL import Image, ImageTk

def show_photo():
  img=Image.open("image.jpg")  
  photo=ImageTk.PhotoImage(img)   
  width=photo.width();
  height=photo.height()   
  w=Tkinter.Toplevel(root)  
  w.geometry(str(width 2) 'x' str(height 2))
  w.title(str(width) 'x' str(height))  
  canvas=Tkinter.Canvas(w, bg="black", width=width, height=height)  
  canvas.pack()  
  img=canvas.create_image(0,0,anchor=Tkinter.NW,image=photo)
  xxx    # NameError

root=Tkinter.Tk() 
mainmenu = Tkinter.Menu(root) 
menu1 = Tkinter.Menu(mainmenu)
mainmenu.add_cascade(label="Menu 1", menu=menu1)
menu1.add_command(label="Show photo", command=show_photo)
root.config(menu=mainmenu)
root.mainloop()
  

Если я не вставлю неправильную строку (здесь: xxx), изображение не появится, только черный прямоугольник правильного размера.

Есть какие-нибудь подсказки?

Заранее спасибо, Эрик.

Ответ №1:

Я предполагаю следующее: ваше изображение находится в локальной переменной. При show_photo() выходе ссылка на изображение собирается мусором, и, таким образом, изображение уничтожается. Когда это происходит, Tkinter больше не может отображать изображение, потому что данные исчезли.

Попробуйте сохранить ссылку на изображение либо в глобальной переменной, либо в переменной экземпляра.

Комментарии:

1. Большое спасибо! Это работает! Здесь «глобальное фото» необходимо непосредственно перед определением «фото».