如何用Tkinter实现上下布局的两个Frame高度一致?
解决Tkinter中两个嵌入Matplotlib绘图的Frame高度不一致问题
要让上下两个Frame高度完全一致,核心是让它们平分窗口可用高度,同时确保内部Matplotlib画布的初始尺寸统一,具体修改方案如下:
修改后的完整代码
import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import matplotlib.pyplot as plt # Root窗口初始化 root = tk.Tk() root.state('zoomed') # 全局Matplotlib样式配置 plt.rcParams["axes.prop_cycle"] = plt.cycler(color=["#4C2A85", "#BE96FF", "#957DAD", "#5E366E", "#A98CCC"]) plt.style.use('ggplot') L = [i for i in range(10)] # 上方Frame canv = tk.Frame(root) # 设置Frame填充水平/垂直空间,允许随窗口拉伸,添加边距优化布局 canv.pack(fill=tk.BOTH, expand=True, padx=5, pady=(5, 2)) # 创建固定尺寸的Figure,确保上下画布初始尺寸一致 fig, ax = plt.subplots(figsize=(10, 4)) ax.fill_between(L, L) ax.set_title("Upper plot") canvas = FigureCanvasTkAgg(fig, canv) canvas.draw() # 让画布填满所在Frame canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # 下方Frame canv2 = tk.Frame(root) canv2.pack(fill=tk.BOTH, expand=True, padx=5, pady=(2, 5)) # 与上方使用完全相同的Figure尺寸 fig2, ax2 = plt.subplots(figsize=(10, 4)) ax2.fill_between(L, L) ax2.set_title("Lower plot") canvas2 = FigureCanvasTkAgg(fig2, canv2) canvas2.draw() canvas2.get_tk_widget().pack(fill=tk.BOTH, expand=True) root.mainloop() # 修复原代码遗漏的括号,确保GUI启动
关键修改说明
- Frame的pack参数配置:给两个Frame添加
fill=tk.BOTH(填充水平和垂直方向空间)和expand=True(允许Frame随窗口拉伸),这样两个Frame会自动平分窗口的可用高度;padx/pady用于添加边距,避免绘图紧贴窗口边缘。 - 统一Matplotlib画布尺寸:创建
fig和fig2时指定相同的figsize,消除Matplotlib内部布局(如标题、轴元素)差异导致的画布尺寸不一致问题。 - Canvas的拉伸设置:让画布的tk部件也设置
fill=tk.BOTH, expand=True,确保画布完全填满所在Frame,避免Frame内部出现空白区域。 - 修复mainloop调用:原代码中
root.mainloop未加括号,会导致GUI无法正常启动,必须补上括号。
内容的提问来源于stack exchange,提问作者Zakaria
相关产品推荐
相关产品推荐

