固定Tkinter窗口大小,动态调整网格内Matplotlib子图尺寸
解决Tkinter中固定窗口尺寸、自适应Matplotlib绘图的方案
要实现固定窗口大小,让动态数量的Matplotlib绘图自适应填充且保持相对比例,核心是固定Tkinter窗口尺寸+让画布填充网格单元格+配置Matplotlib子图自适应布局,具体操作如下:
关键修改点
- 锁定Tkinter窗口尺寸
- 用
geometry()设置固定初始窗口大小,再用resizable(False, False)禁止用户调整窗口,确保窗口尺寸始终不变。
- 用
- 配置网格布局权重
- 给所有行和列设置
weight=1,让网格单元格自动分配窗口内的可用空间,画布就能填充对应的单元格。
- 给所有行和列设置
- 让Matplotlib画布自适应网格
- 把画布的
grid()方法加上sticky="nsew",让画布拉伸填充整个单元格。
- 把画布的
- Matplotlib子图保持比例并自适应
- 创建Figure时开启
constrained_layout=True,让子图自动调整间距以适应画布大小;同时固定Figure的宽高比,确保绘图整体比例不变。
- 创建Figure时开启
完整示例代码
import tkinter as tk from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg root = tk.Tk() # 固定窗口大小,可按需调整尺寸 root.geometry("800x600") root.resizable(False, False) # 切换参数测试不同绘图数量: # 第一组:2列4个图 cols = 2 rows = 2 # 第二组:3列6个图 # cols = 3 # rows = 2 # 配置所有行和列的权重,让单元格填充窗口空间 for i in range(rows): root.grid_rowconfigure(i, weight=1) for j in range(cols): root.grid_columnconfigure(j, weight=1) # 创建Matplotlib Figure,固定宽高比,开启自适应布局 fig = Figure(figsize=(4, 3), constrained_layout=True) # 生成对应数量的子图 for idx in range(rows * cols): ax = fig.add_subplot(rows, cols, idx+1) ax.plot([1,2,3], [idx, idx+1, idx+2]) ax.set_title(f"Plot {idx+1}") # 创建画布并添加到网格,sticky参数让画布填充单元格 canvas = FigureCanvasTkAgg(fig, master=root) canvas.get_tk_widget().grid(row=0, column=0, rowspan=rows, columnspan=cols, sticky="nsew") canvas.draw() root.mainloop()
代码说明
- 切换
cols和rows的值时,窗口大小始终保持不变,所有子图会自动调整大小和间距,维持相对比例。 constrained_layout=True会自动处理子图标题、坐标轴标签的间距,避免内容重叠。- 如果需要单个子图保持固定宽高比,可以给每个
ax添加ax.set_aspect('equal', adjustable='box'),按需选择即可。
内容的提问来源于stack exchange,提问作者Plantz
相关产品推荐
相关产品推荐

