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

如何在Tkinter按钮中调整PNG图片大小并正常显示?

问题:Tkinter按钮中调整PNG图片大小后无法显示的解决办法

我正在从零开始自学Python和Tkinter,现有如下按钮代码:

info = tk.PhotoImage(file= "./assets/info.png")
boton_info = ttk.Button(f2, width=30, image= info)
boton_info.grid(row=2, column=3, sticky="nwe", padx=15)

我希望显示一个小型信息按钮,但当前使用的是512x512的PNG图片,显示尺寸过大。我尝试通过以下方式调整图片大小:

info_g = Image.open("./assets/info.png")
info = info_g.resize((30,30), Image.LANCZOS)
boton_info = ttk.Button(f2, width=30, image=info)

但执行时出现错误,请问如何解决这个问题,实现调整图片大小并在按钮中正常显示?


解决方法

错误核心是:PIL的Image.resize()返回的是PIL专属的Image对象,而Tkinter的组件只接受自身兼容的PhotoImage类型,直接传入会触发类型错误。按以下步骤修改代码即可解决:

  1. 确保安装Pillow库(PIL的维护分支):
pip install pillow
  1. 调整代码逻辑,完成图片缩放、格式转换,并保留对象引用(避免Tkinter垃圾回收导致图片消失):
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk

# 1. 打开原图并缩放至目标尺寸
info_img = Image.open("./assets/info.png")
info_resized = info_img.resize((30, 30), Image.LANCZOS)

# 2. 将PIL图片转换为Tkinter兼容的PhotoImage
info_photo = ImageTk.PhotoImage(info_resized)

# 3. 创建按钮并绑定图片
boton_info = ttk.Button(f2, image=info_photo)
# 关键:给按钮对象绑定图片引用,防止被Python垃圾回收机制清理
boton_info.image = info_photo

# 4. 布局按钮
boton_info.grid(row=2, column=3, sticky="nwe", padx=15)
  1. 额外提示:
  • 无需设置ttk.Button的width=30,按钮会自动适配缩放后的图片尺寸,手动设置width可能导致按钮或图片变形。
  • Image.LANCZOS是高质量的降采样算法,适合缩小图片时保留细节,比默认算法效果更好。

内容的提问来源于stack exchange,提问作者Mateo R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:47:15