1

したがって、(特定のファイルから) 表示された画像と、ウィンドウを閉じるための単一のボタンを備えたウィンドウを作成したいと考えています。これまでのところ、ウィンドウが表示され、画像に合わせてウィンドウのサイズが変更されますが、画像自体は表示されません。これが私がこれまでに持っているものです

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()

クラスにしないで同じことを書いたところ、うまくいきました。

4

1 に答える 1

0

問題は、作成したものへの独自の参照を保持する必要があることですPhotoImage。そうしないと、Tkinter が参照を保持しないため、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.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()
于 2013-08-13T04:52:37.460 に答える