引言
碰到以下問題:
代碼1:
from Tkinter import * root = Tk() photo = PhotoImage(file=r'E:\workspace\python\111.gif') Label(root,image=photo).grid() root.mainloop()
這個能正常顯示圖片。而下面的代碼卻不能:
代碼2:
from Tkinter import *
root = Tk()
def _test_img():
win= Toplevel(root)
photo = PhotoImage(file=r'E:\workspace\python\111.gif')
Label(win,image=photo).pack()
Button(root,text="test",command=_test_img).grid()
root.mainloop()
懷疑是生命周期的問題,引入1/0錯誤:
from Tkinter import *
root = Tk()
def _test_img():
win= Toplevel(root)
photo = PhotoImage(file=r'E:\workspace\python\111.gif')
Label(win,image=photo,bg='blue').pack()
1/0
Button(root,text="test",command=_test_img).grid()
root.mainloop()
這樣就能正常顯示圖片,因python的回收機制被錯誤中斷了。

或者將photo變成全局變量也能達到同樣的效果。
這里很奇怪,win/Label在函數執行完沒有銷毀,而photo貌似卻銷毀了。
python何時銷毀一個對象?
關於垃圾回收機制,可以參考下這里。
問題來了:神馬叫做引用?
root->win->Label--?-->photo
為何最后一環斷掉了?看下PhotoImage的__init__函數,如下:
