Tkinter按钮配置图片后缩为小黑块不显示,求原因分析
问题原因及解决办法
核心原因:PhotoImage被垃圾回收
你遇到的问题核心是Python的垃圾回收机制回收了click_btn这个PhotoImage对象。Tkinter的PhotoImage需要有一个持续存在的引用才能正常显示,你的代码里click_btn是临时变量,当程序执行到root.mainloop()前,这个变量没有被其他对象持有引用,Python就会把它回收掉,导致按钮找不到图片资源,最终缩成小黑矩形。
另外,你给按钮设置的width=6、height=3是基于文本的尺寸单位(字符数),和图片的像素尺寸不匹配,但这不是主要原因,核心问题还是引用丢失。
解决办法
有两种简单的方式解决:
1. 将PhotoImage绑定到按钮的属性上
修改图片配置的代码,把click_btn赋值给按钮的一个属性,这样按钮会持有图片的引用,防止被回收:
click_btn= PhotoImage(file='pawn.png') UiBoard[0][0].image = click_btn # 新增这一行,绑定引用 UiBoard[0][0].configure(image = click_btn)
2. 将PhotoImage设为全局变量(适用于函数内代码)
如果你的代码是写在函数里,也可以把click_btn声明为全局变量,确保它不会被局部作用域回收:
global click_btn click_btn= PhotoImage(file='pawn.png') UiBoard[0][0].configure(image = click_btn)
额外优化建议
- 若想让按钮尺寸适配图片,可去掉按钮初始的
width和height参数,按钮会自动根据图片大小调整尺寸。 - 如果使用JPG等Tkinter原生不支持的图片格式,需要借助
PIL库的ImageTk来加载。
内容的提问来源于stack exchange,提问作者greedbag
相关产品推荐
相关产品推荐

