You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:06:04