如何在Tkinter中实现图片无拉伸自适应显示,小图原尺寸大图适配窗口
你可以通过计算图片与展示区域的缩放比例来实现该需求,核心逻辑如下:
- 先确定展示区域的最大允许宽高,你当前代码里展示区最大是540x540(窗口550x550加了10px的内边距)
- 读取原始图片后获取其宽高,分别计算宽和高方向的适配比例,取两个比例中较小的值作为最终缩放比例
- 若最终缩放比例小于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
相关产品推荐
相关产品推荐

