python GUI入坑第一步button上的image

首先,我们知道在gui的实现中,所有的图像都是在被不断刷新的。

我也是在最近写到的一个程序中更加深刻地认识到了这一点。

我把遇到的问题做了简要的提取,在这里分享给大家!

成功的例子

请看下面两个程序:

1
2
3
4
5
from tkinter import *
root = Tk()
pp = PhotoImage(file = r"C:/Users/C-82/Desktop/meal/whatMeals3/graph/search.gif")
Button(root,image = pp).pack()
root.mainloop()

在这里插入图片描述 实验成功!

失败的例子

另外一个程序:

1
2
3
4
5
6
7
from tkinter import *
root = Tk()
def nn(root,pp):
pp = PhotoImage(file = r"C:/Users/C-82/Desktop/meal/whatMeals3/graph/search.gif")
Button(root,image = pp).pack()
Button(root,text="bb",command = lambda:nn(root,pp)).pack()
root.mainloop()

按照程序,当我们点击bb时,界面上应该产生一个新的button,并且这个button应该带有北京图片,但是却产生了以下的结果: 在这里插入图片描述 新的button是产生了,但是却没有背景!

原因分析

原因是这样的: 所有的像素都在不断地进行更新,但是我们注意到,程序里面有一个却是与之异步的,那就是所有的事件函数,当我们点击相应的监听区域时,就会触发相应的函数,但是函数只执行一次。

知道了这一点,我们再来看这个例子,当我们点击bb这个button时,函数nn就会被执行,可是nn一瞬间就执行结束了,当函数返回时,nn创建的所有的局部变量就会被回收,所以刚刚创建的PhotoImage对象就没有了,当mainloop开启事件循环时,这个新的button上却找不到这个对象了,所以就没有了。 解决的办法就是:将pp创建在主函数内,并将其作为参数传到nn函数中!