Python 将图像添加到顶级窗口

Python 将图像添加到顶级窗口,python,tkinter,Python,Tkinter,我试图在python的顶级窗口中添加一个图像,但是我似乎无法让它工作 我尝试过使用画布,并在堆栈溢出上遵循其他一些步骤。有一件事我没有尝试过,那就是使用class、init和self,但我真的不明白这一点,我希望我能在不使用self的情况下实现我的目标。像这样的东西:D def pika(): def close(): 战胜 win=顶级() win.geometry(“150x150”) 赢得冠军(“我选择你”) 黄色B=标签(赢,背景='黄色',前景='黄色',padx=100,pady=1

我试图在python的顶级窗口中添加一个图像,但是我似乎无法让它工作

我尝试过使用画布,并在堆栈溢出上遵循其他一些步骤。有一件事我没有尝试过,那就是使用class、init和self,但我真的不明白这一点,我希望我能在不使用self的情况下实现我的目标。像这样的东西:D

def pika():
def close():
战胜
win=顶级()
win.geometry(“150x150”)
赢得冠军(“我选择你”)
黄色B=标签(赢,背景='黄色',前景='黄色',padx=100,pady=100)
yellowb.pack()
poke=PhotoImage(file=“pika.gif”)
皮卡=标签(图像=戳)#没用
pika.grid(行=0,列=1,padx=10,pady=10)
按钮=按钮(win,text=“Close”,command=Close)
按钮位置(x=49,y=130)
这是windows的主要代码

win=Tk()
win.geometry(“290x200”)
win.title('错误')
text1=Label(win,bg=“Cyan”,fg='Teal',padx=50,pady=75,text='#散列错误',
字体=('Times','40','bold'))
text1.place(x=win.winfo_width()/2,y=win.winfo_width()/2)
button1=按钮(win,文本='绿色',命令=绿色)
按钮1.位置(x=40,y=160)
button2=按钮(win,文本='blue',命令=blue)
按钮2.位置(x=90,y=160)
button3=按钮(win,text=“red”,command=红色)
按钮3.位置(x=130,y=160)
button4=按钮(win,文本='黄色',命令=黄色)
按钮4.位置(x=170,y=160)
button5=按钮(win,text=“orange”,command=orange)
按钮5.位置(x=229,y=160)
鸡蛋=照片图像(file=“pika.gif”)
eggpic=按钮(win,image=eggs,bg='Cyan',fg='Cyan',command=pika)
蛋图位置(x=100,y=20)
def close():
战胜
closebut=按钮(win,text='close',command=close)
closebut.place(x=0,y=0)
当我点击一个按钮,它会打开一个新窗口,窗口的背景是黄色的,所有内容都符合预期,但是图像不会出现在窗口上,并且图像大小的白色框会出现在主窗口中


您可能会遇到两个问题:


首先:每个小部件都需要父部件。如果不使用它,则将小部件分配到主窗口

您在
标签(image=poke)
中遇到了这个问题,因为您在中忘记了
win

 pika = Label(win, image=poke)
这就是为什么在主窗口中看到矩形而不是顶层窗口


Second:PhotoImage中存在缺陷<代码>垃圾收集器在函数中创建垃圾收集器并将其分配给局部变量时,将其从内存中删除。然后你可以看到空的图像

您必须将
PhotoImage
分配给全局变量或分配给函数中的其他小部件

分配给其他小部件的流行解决方案:

poke = PhotoImage(file = "pika.gif")
pika = Label(win, image=poke)
pika.photo = poke # <-- assign PhotoImage to other widget too
poke=PhotoImage(file=“pika.gif”)
皮卡=标签(赢,图像=戳)

pika.photo=poke#我对tkinter很陌生,所以我真的不知道如何使用self。它看起来非常可怕。你只能使用
command=win.destroy
而不是
def close():win.destroy()
command=close