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

tkinter窗口最大化时如何自动调整两个并排标签内不同图片的尺寸

窗口最大化时Tkinter标签图片同步放大实现方案

修改思路

  • 给页面布局的行列设置拉伸权重,确保标签随窗口同步拉伸
  • 保留原始图片对象用于缩放,避免反复缩放导致画质下降
  • 绑定窗口尺寸变化事件,动态计算可用空间后等比例更新标签图片

完整可运行代码

import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
from PIL import ImageTk, Image
import tkinter as tk
from tkinter import ttk

# 缺失页面类占位,可替换为实际业务实现
class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
class PageTwo(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
class PageThree(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

class Z(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        # tk.Tk.iconbitmap(self, default="anecto.ico") # 无对应图标可注释此行
        tk.Tk.wm_title(self, "WisualiseWind")
        
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (StartPage, PageOne, PageTwo, PageThree):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)
    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        # 保存原始图片对象,用于后续缩放
        self.load = Image.open('abc.png')
        self.load1 = Image.open('xyz.jpg')
        # 初始化图片标签
        render = ImageTk.PhotoImage(self.load)
        self.label = tk.Label(self, image = render)
        self.label.image = render
        render1 = ImageTk.PhotoImage(self.load1)
        self.label1 = tk.Label(self, image = render1)
        self.label1.image = render1
        # 设置布局权重,图片所在列随窗口拉伸
        self.grid_columnconfigure(2, weight=1)
        self.grid_columnconfigure(4, weight=1)
        self.grid_rowconfigure(0, weight=1)
        # 标签设置sticky属性跟随单元格拉伸
        self.label.grid(row = 0, column = 2, pady=10,padx=10, sticky="nsew")
        self.label1.grid(row = 0, column = 4, pady=10,padx=10, sticky="nsew")
        
        button = ttk.Button(self, text="Start",
                            command=lambda: controller.show_frame(PageOne))
        button.grid(row = 6, column = 3)
        # 绑定窗口尺寸变化事件
        self.bind("<Configure>", self.resize_image)
    
    def resize_image(self, event):
        # 尺寸过小时不处理,避免报错
        if self.label.winfo_width() < 20 or self.label.winfo_height() <20:
            return
        # 缩放第一张图,保留宽高比
        target_size = (self.label.winfo_width()-20, self.label.winfo_height()-20)
        img = self.load.copy()
        img.thumbnail(target_size, Image.Resampling.LANCZOS)
        new_render = ImageTk.PhotoImage(img)
        self.label.config(image=new_render)
        self.label.image = new_render
        # 缩放第二张图
        target_size1 = (self.label1.winfo_width()-20, self.label1.winfo_height()-20)
        img1 = self.load1.copy()
        img1.thumbnail(target_size1, Image.Resampling.LANCZOS)
        new_render1 = ImageTk.PhotoImage(img1)
        self.label1.config(image=new_render1)
        self.label1.image = new_render1

if __name__ == "__main__":
    app = Z()
    app.geometry("800x600")
    app.mainloop()

注:Pillow 9.0以下版本请将Image.Resampling.LANCZOS替换为Image.ANTIALIAS

内容的提问来源于stack exchange,提问作者Mayank Dhami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:48:04