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

如何在Tkinter中实现图片无拉伸自适应显示,小图原尺寸大图适配窗口

你可以通过计算图片与展示区域的缩放比例来实现该需求,核心逻辑如下:

  1. 先确定展示区域的最大允许宽高,你当前代码里展示区最大是540x540(窗口550x550加了10px的内边距)
  2. 读取原始图片后获取其宽高,分别计算宽和高方向的适配比例,取两个比例中较小的值作为最终缩放比例
  3. 若最终缩放比例小于1,说明图片尺寸大于展示区域,按比例缩放;若大于等于1,说明图片小于展示区域,直接使用原始尺寸即可。

修改后的完整可运行代码如下:

from tkinter import Tk, Label
from PIL import Image, ImageTk

root = Tk()

root.title("Display Images")
root.geometry('550x550')
root.maxsize(550, 550)
# root.iconbitmap('icon.ico') 没有对应icon文件可注释该行
root.configure(background='#333')

# 定义展示区域的最大宽高,需要调整尺寸直接修改这两个值即可
MAX_DISPLAY_W = 540
MAX_DISPLAY_H = 540

# 读取原始图片
image = Image.open('./image.jpg')
orig_w, orig_h = image.size

# 计算缩放比例
scale_w = MAX_DISPLAY_W / orig_w
scale_h = MAX_DISPLAY_H / orig_h
min_scale = min(scale_w, scale_h)

if min_scale < 1:
    # 图片尺寸超过展示区,按等比例缩放避免拉伸
    new_w = int(orig_w * min_scale)
    new_h = int(orig_h * min_scale)
    # 兼容新旧版本Pillow的抗锯齿参数
    try:
        resized_image = image.resize((new_w, new_h), Image.Resampling.LANCZOS)
    except AttributeError:
        resized_image = image.resize((new_w, new_h), Image.ANTIALIAS)
else:
    # 图片尺寸小于展示区,直接使用原始尺寸
    resized_image = image

disp_image = ImageTk.PhotoImage(resized_image)

label = Label(image=disp_image, border=0, bg='#333')
label.pack(padx=10, pady=10)

root.mainloop()

补充说明:

  • 如果你需要用示例里的350x350展示区域,直接把MAX_DISPLAY_W和MAX_DISPLAY_H的值都改为350即可
  • 给Label设置了和窗口同色的背景,避免小尺寸图片展示时出现不协调的白边

内容的提问来源于stack exchange,提问作者Sachin Acharya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:15:02