Tkinter按钮更换图片后显示空白问题求助
解决Tkinter按钮更换图片后空白的问题
问题根源
按钮空白的核心原因是**ImageTk.PhotoImage创建的对象被Python垃圾回收机制销毁**:在change函数里,photo是局部变量,函数执行完毕后会被回收,而Tkinter按钮控件未保留对该图片对象的强引用,导致无法渲染图片。
错误代码分析
你后来添加的button["button"]()是错误操作——button["button"]是Tkinter的Button实例对象,不能直接用()调用,只有按钮绑定的command函数才是可调用的,这就是报错的直接原因。
正确解决方案
要避免图片被回收,需把PhotoImage对象保存到不会被轻易回收的地方,以下是两种可行修改方式:
方式1:将PhotoImage绑定到按钮控件自身属性
def change(button,pic): photo = ImageTk.PhotoImage(pic) btn = button["button"] btn.configure(image=photo) # 把photo绑定到按钮属性,避免被垃圾回收 btn.photo = photo button["img"] = pic
方式2:将PhotoImage存入button字典
def change(button,pic): photo = ImageTk.PhotoImage(pic) button["button"].configure(image=photo) # 在字典中新增键保存photo对象 button["photo"] = photo button["img"] = pic
补充提示
- 确保传入的
pic是PIL正确打开的Image对象(比如Image.open("test.png")),否则也会导致图片无法显示。 - 若后续需要切换回原图片,同样要保留原
PhotoImage对象的引用,避免被回收。
内容的提问来源于stack exchange,提问作者Martin Kulina
相关产品推荐
相关产品推荐

