tkinter按钮绑定函数内使用config修改图片失效是什么原因?
问题原因
你遇到的不是config方法的写法错误,是Tkinter特有的PhotoImage对象垃圾回收机制导致的问题:
Tkinter控件本身不会主动持有你传入的图片对象的引用,当ImageTk.PhotoImage生成的图片对象没有其他Python侧的变量引用时,就会被Python的垃圾回收机制销毁,对应控件上的图片就会失效,表现为切换无反应、图片不显示。
两种写法的差异解释
- 回调函数内的写法:
overheal是回调函数的局部变量,函数执行完成后,这个局部变量就会被释放,对应的图片对象没有其他引用,直接被回收,所以按钮上的图片无法正常显示,看起来是config没有生效。 - 主代码内的写法:
overheal是全局作用域的变量,只要程序还在运行,这个变量就不会被销毁,图片对象一直存在有效引用,所以能正常显示。
解决方案
你可以任选以下任意一种方式修复问题:
- 将回调函数内的图片对象声明为全局变量,维持引用:
def select_precision(): global overheal overheal = image_resize((20, 20), "gui_project/item_simulation/overheal.png") runepage_00.config(image=overheal)
- 将图片对象绑定到对应控件的自定义属性上,控件存活时属性就不会被回收:
def select_precision(): overheal = image_resize((20, 20), "gui_project/item_simulation/overheal.png") runepage_00.config(image=overheal) runepage_00.image = overheal # 绑定到控件属性维持引用
- 提前在全局作用域加载所有需要用到的图片,切换时直接调用已加载的图片对象即可。
内容的提问来源于stack exchange,提问作者La Aile Ciel
相关产品推荐
相关产品推荐

