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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:41:21