如何从Tkinter的grid管理器获取行列像素尺寸以适配Matplotlib图表
解决Tkinter grid布局下获取行列像素尺寸适配Matplotlib的方案
实现步骤
- 首先配置grid缩放权重:你需要先给figure所在的行和列设置
weight属性大于0,保证行列会跟随父容器的尺寸同步缩放,基础配置示例:
# 假设figure放在root容器的行0、列0位置 root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1)
- 绑定尺寸变更事件:给figure所在的父容器绑定
<Configure>事件,当容器尺寸变化时自动触发适配逻辑 - 调用
grid_bbox获取单元格尺寸:通过父容器的grid_bbox(column, row)方法可以直接拿到指定单元格的x偏移、y偏移、宽度、高度四个返回值,单位均为像素。调用前可以执行update_idletasks()强制刷新布局,避免拿到未渲染的0值 - 转换单位更新Matplotlib尺寸:Matplotlib的figure尺寸单位为英寸,需要将拿到的像素值除以figure的dpi转换后,调用
set_size_inches更新尺寸,再刷新画布即可
完整可运行示例
import tkinter as tk from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg root = tk.Tk() root.geometry("800x600") # 配置行0、列0支持缩放 root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) # 初始化Matplotlib图表 fig = Figure(figsize=(5, 4), dpi=100) ax = fig.add_subplot(111) ax.plot([1,2,3,4], [1,4,2,3]) # 把图表画布放到grid的0行0列 canvas = FigureCanvasTkAgg(fig, master=root) canvas.get_tk_widget().grid(row=0, column=0, sticky="nsew") def resize_handler(event): # 过滤非主窗口的触发事件,避免子组件 resize 重复触发 if event.widget != root: return # 强制刷新布局保证拿到最新尺寸 root.update_idletasks() # 获取0行0列的单元格像素尺寸 _, _, cell_width, cell_height = root.grid_bbox(0, 0) # 转换单位后更新figure尺寸 fig.set_size_inches(cell_width / fig.dpi, cell_height / fig.dpi) canvas.draw() # 绑定窗口 resize 事件 root.bind("<Configure>", resize_handler) root.mainloop()
内容的提问来源于stack exchange,提问作者AndrewK
相关产品推荐
相关产品推荐

