2013-07-02 126 views
1

所以我想創建一個窗口,顯示圖像(來自特定文件)和單個按鈕關閉窗口。 到目前爲止,它顯示窗口,調整窗口大小以適應圖像,但不顯示圖像本身。 這裏是我到目前爲止Python丟失圖像

from Tkinter import * 
import Image 
import ImageTk 
class MyApp:       
    def __init__(self, rData): 
    self.cont1 = Frame(rData) 
    self.cont1.pack(side="top", padx=5, pady=5)  
    self.button1 = Button(rData) 
    self.button1["text"]= "Exit"  
    self.button1["background"] = "red"  
    self.button1.pack(side="bottom",padx=5, pady=5, fill=X)       
    self.button1["command"]= rData.destroy 
    self.picture1 = Label(self.cont1) 
    self.picture1["image"] = ImageTk.PhotoImage(Image.open("fire.ppm")) 
    self.picture1.pack(fill="both") 
root = Tk() 
myapp = MyApp(root) 
root.mainloop() 

當我寫了同樣的事情,而不使它成爲一個類,它的工作就好了。

回答

0

問題是,你需要保留自己的引用到你創建的PhotoImage,否則python會垃圾收集它,因爲Tkinter不保留對它的引用。這是一個錯誤或一個功能,取決於你的想法。此代碼應解決您的問題:

from Tkinter import * 
import Image 
import ImageTk 
class MyApp:       
    def __init__(self, rData): 
    self.cont1 = Frame(rData) 
    self.cont1.pack(side="top", padx=5, pady=5)  
    self.button1 = Button(rData) 
    self.button1["text"]= "Exit"  
    self.button1["background"] = "red"  
    self.button1.pack(side="bottom",padx=5, pady=5, fill=X)       
    self.button1["command"]= rData.destroy 
    self.picture1 = Label(self.cont1) 
    self.photoImage = ImageTk.PhotoImage(Image.open("fire.ppm")) # This line prevents your photo image from getting garbage collected. 
    self.picture1["image"] = self.photoImage 
    self.picture1.pack(fill="both") 
root = Tk() 
myapp = MyApp(root) 
root.mainloop()