将图像按钮添加到顶级窗口Tkinter

时间:2013-07-23 19:28:49

标签: image python-2.7 tkinter

我正在构建一个小型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()

1 个答案:

答案 0 :(得分:2)

创建新的顶层时,您使用局部变量来引用图像。因此,当方法退出时,垃圾收集器将删除该图像。您需要在全局变量中保存引用,或者以其他方式保护它不受垃圾收集器的影响

保存引用的常用方法是使其成为按钮的属性:

img1 = ImageTk.PhotoImage(...)
c1 = Button(...)
c1.image = img1