You need to enable JavaScript to run this app. tkinter如何调整frame尺寸 用grid布局实现notebook内frame自适应
优惠活动
大模型
产品
解决方案
定价
更多

tkinter如何调整frame尺寸 用grid布局实现notebook内frame自适应

问题核心原因

你之前的代码没有为grid布局的父容器配置行、列权重,也没有正确使用sticky参数,这是grid布局实现自适应的必要配置,手动绑定窗口事件修改notebook尺寸的方案完全可以用原生grid特性替代。

具体解决方案

1. 按百分比占满宽高的实现方法

grid布局的宽高占比由父容器的rowconfigure(行配置)、columnconfigure(列配置)的weight参数控制,参数值为占比权重:

  • 要子元素占满100%父容器宽度:给父容器对应列设置weight=1,子元素grid时添加sticky="nsew"参数(表示向上下左右四个方向拉伸填满单元格)
  • 要实现高度百分比分配:给父容器的不同行设置对应比例的weight值即可,比如两个LabelFrame各占50%高度,就给两行的weight都设为1;如果需要3:7的高度占比,就分别设置weight为3和7,后续新增元素只要调整对应行/列的weight值就能实现自定义比例分配。

2. 元素居中实现

如果不需要元素拉伸填满单元格,只要不为子元素设置sticky参数,元素默认会在对应grid单元格内居中显示。

修改后的完整可运行代码

import tkinter as tk
from tkinter import ttk, Tk

root = Tk()
root.geometry('1200x800')
root.title("Test")

# 给root的行0、列0设置权重1,保证子元素可以铺满整个窗口
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)

tab_frame = ttk.Notebook(root)
# notebook grid时添加sticky=nsew,自动铺满root的可用空间,无需手动绑定事件修改尺寸
tab_frame.grid(sticky="nsew")

# 样式配置可复用,不需要重复创建Style对象
s = ttk.Style()
s.configure('test_red.TFrame', background='red')
s.configure('test_green.TFrame', background='green')
s.configure('test_blue.TFrame', background='blue')


tab1 = ttk.Frame(tab_frame, style='test_red.TFrame')
tab2 = ttk.Frame(tab_frame, style='test_blue.TFrame')

tab_frame.add(tab1, text='Tab1')
tab_frame.add(tab2, text='Tab2')

# 给tab1的列0设置权重1,保证子元素可以占满100%宽度
tab1.columnconfigure(0, weight=1)
# 给tab1的行0、行1都设置权重1,两行各占50%高度
tab1.rowconfigure(0, weight=1)
tab1.rowconfigure(1, weight=1)

### frames in tab
label_frame1 = ttk.Labelframe(tab1, text='Label1', style='test_green.TFrame')
# 添加sticky=nsew,填满当前单元格
label_frame1.grid(row=0, column=0, sticky="nsew")

label_frame2 = ttk.Labelframe(tab1, text='Label2', style='test_blue.TFrame')
label_frame2.grid(row=1, column=0, sticky="nsew")

root.mainloop()

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:54:04