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
相关产品推荐
相关产品推荐

