如何在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类型,直接传入会触发类型错误。按以下步骤修改代码即可解决:
- 确保安装Pillow库(PIL的维护分支):
pip install pillow
- 调整代码逻辑,完成图片缩放、格式转换,并保留对象引用(避免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)
- 额外提示:
- 无需设置ttk.Button的
width=30,按钮会自动适配缩放后的图片尺寸,手动设置width可能导致按钮或图片变形。 Image.LANCZOS是高质量的降采样算法,适合缩小图片时保留细节,比默认算法效果更好。
内容的提问来源于stack exchange,提问作者Mateo R
相关产品推荐
相关产品推荐

