2

ボタンをクリックすると新しいトップレベルウィンドウが開き、ボタンの画像が表示される小さなGUIアプリケーションを構築しています。

イメージ ボタンをルート ウィンドウで動作させることはできますが、トップ レベル ウィンドウでは動作しません。ブラックボックスのみが表示されます。

両方のウィンドウに汎用ボタンがあり、機能します。

私はPythonが初めてです。

import Tkinter 
from Tkinter import *
from PIL import ImageTk, Image

root = Tkinter.Tk()

root.title("First Window")                  
root.configure(background = "black")    

def new_window():
    win2 = Toplevel(root)
    win2.geometry("650x350+50+40")        
    win2.title("Second Window!")            
    win2.configure(background = "white")    

    def close1():
        win2.destroy()

    img1 = ImageTk.PhotoImage(Image.open("./images/close.gif"))
    c1 = Button(win2, image = img1, bg ="black", command = close1)
    c1.grid(row = 1)

    c2= Tkinter.Button(win2, text='close', command = close1)
    c2.grid(row = 2)    


nw = Tkinter.Button(root, text = 'New Window' , command = new_window)
nw.grid(row = 1)

def close3(): 
    root.destroy()

img3 = ImageTk.PhotoImage(Image.open("./images/close.gif"))
c3 = Button(root, image = img3, bg ="black", command = close3)
c3.grid(row = 2)


root.mainloop()
4

1 に答える 1

3

新しいトップレベルを作成するときは、ローカル変数を使用してイメージを参照しています。このため、メソッドが終了すると、ガベージ コレクターはイメージを削除します。参照をグローバル変数に保存するか、ガベージコレクターから保護する他の方法が必要です

参照を保存する一般的な方法は、ボタンの属性にすることです。

img1 = ImageTk.PhotoImage(...)
c1 = Button(...)
c1.image = img1
于 2014-01-03T19:09:06.200 に答える