Python Tkinter图片按钮仅下方加任意字符才显示是什么原因?
问题原因
这是Tkinter开发中PhotoImage对象的经典垃圾回收问题:Python的垃圾回收机制会清理没有被引用的PhotoImage对象内存,而Tkinter的Button组件本身不会额外持有PhotoImage的强引用,一旦你定义的img变量被回收,按钮就会丢失图片资源导致显示为空。
你观察到的“添加任意无意义字符就能显示但有报错”的现象逻辑也和这个问题匹配:你添加的无意义字符属于无效代码,程序运行到这里会抛出异常终止,当前作用域没有正常退出,img变量还未被回收,所以图片能正常渲染,但会弹出报错提示。而删除无效字符后代码正常运行结束,img作为局部变量被回收,图片自然就不显示了。
解决方案
方法1:给按钮组件绑定图片引用(最推荐,不污染全局作用域)
给Button对象新增一个自定义属性持有PhotoImage实例,保证引用一直存在:
def eastereggtxt1(): # 你的功能代码 pass img = PhotoImage(file = r'pathtoimage.png') imgbutn = Button(EntryWindow, image = img, borderwidth = 0, command = eastereggtxt1) imgbutn.img = img # 新增这行,给按钮绑定图片引用 imgbutn.grid(row = 18, column = 7)
方法2:将图片变量设为全局变量
如果是在函数内部定义的图片变量,声明为全局变量即可避免被回收:
def 你的函数名(): global img # 新增这行声明为全局变量 img = PhotoImage(file = r'pathtoimage.png') imgbutn = Button(EntryWindow, image = img, borderwidth = 0, command = eastereggtxt1) imgbutn.grid(row = 18, column = 7)
方法3:类开发场景下设为实例属性
如果你的Tkinter项目是基于类开发的,直接把图片存为实例属性即可:
self.img = PhotoImage(file = r'pathtoimage.png') imgbutn = Button(EntryWindow, image = self.img, borderwidth = 0, command = eastereggtxt1) imgbutn.grid(row = 18, column = 7)
修改完成后删除你之前添加的无意义字符即可,不会再出现报错,图片也能正常显示。
内容的提问来源于stack exchange,提问作者Esteban Loetz
相关产品推荐
相关产品推荐

