Tkinter中给按钮设置PhotoImage仅显示小方块无法正常显示如何解决
问题根源
你遇到的不是版本问题,是Tkinter的PhotoImage对象存在垃圾回收陷阱:函数insertRedDisc中创建的image是局部变量,函数执行完毕后该变量会被Python自动回收,图片引用丢失,因此按钮无法正常渲染图片,只会显示空白占位方块。
解决方案
最简单的实现方式是将图片对象绑定到按钮实例的属性上,保证引用不会被回收,无需额外引入全局变量,修改后的代码如下:
from tkinter import * def insertRedDisc(buttonParam): image = PhotoImage(file=r"C:\Connect4\red.png") buttonParam['image'] = image # 新增这行:将图片对象绑定到按钮属性,避免被回收 buttonParam.image = image window = Tk() window.title("Button State App") window.geometry('1000x1000') window['bg'] = "blue" for i in range(6): for j in range(7): frame = Frame(master=window, relief=FLAT, borderwidth=5, bg="blue") frame.grid(row=i, column=j, padx=1, pady=1) # 移除了固定宽高参数,按钮会自动适配图片尺寸,避免图片被挤压裁剪 myButton = Button(master=frame) myButton['command'] = lambda theButton=myButton: insertRedDisc(theButton) myButton.pack() window.mainloop()
补充注意事项
- 原生Tkinter的PhotoImage仅支持PNG、GIF、PPM/PGM格式,你使用的PNG格式符合原生支持要求,无需额外引入PIL依赖。
- 按钮的
width、height参数在显示文字时单位为字符大小,显示图片时单位为像素,设置固定值容易导致图片被裁剪,显示图片时建议去掉这两个参数让按钮自动适配。
内容的提问来源于stack exchange,提问作者BCZ
相关产品推荐
相关产品推荐

