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
相关产品推荐
相关产品推荐

