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

固定Tkinter窗口大小,动态调整网格内Matplotlib子图尺寸

解决Tkinter中固定窗口尺寸、自适应Matplotlib绘图的方案

要实现固定窗口大小,让动态数量的Matplotlib绘图自适应填充且保持相对比例,核心是固定Tkinter窗口尺寸+让画布填充网格单元格+配置Matplotlib子图自适应布局,具体操作如下:

关键修改点

  1. 锁定Tkinter窗口尺寸
    • 用geometry()设置固定初始窗口大小,再用resizable(False, False)禁止用户调整窗口,确保窗口尺寸始终不变。
  2. 配置网格布局权重
    • 给所有行和列设置weight=1,让网格单元格自动分配窗口内的可用空间,画布就能填充对应的单元格。
  3. 让Matplotlib画布自适应网格
    • 把画布的grid()方法加上sticky="nsew",让画布拉伸填充整个单元格。
  4. Matplotlib子图保持比例并自适应
    • 创建Figure时开启constrained_layout=True,让子图自动调整间距以适应画布大小;同时固定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:55:19