Tkinter窗口垂直调整时如何让输入区域按比例填充空间?
Tkinter中间区域输入项垂直按比例填充实现方案
当然可行,通过调整网格布局的行权重配置和组件的sticky属性,就能让中间区域的输入项按比例分配垂直剩余空间,避免聚集在窗口中间。
关键修改点
- 根窗口行权重调整:按钮行无需垂直拉伸,将其权重设为
0,固定在窗口底部;中间区域权重设为较大值,占据大部分垂直空间。 - 中间区域布局优化:移除用于占位的空
Label,直接通过rowconfigure为输入行和间隔行设置权重,控制行之间的空间比例;同时确保中间区域的Frame能填满根窗口分配的空间。 - 组件位置控制:通过
sticky属性让输入项保持在各自行的顶部位置,行权重分配的空间会自动作为行间距按比例扩展。
修改后的完整代码
import tkinter as tk from tkinter import ttk PAD = 5 def _header_frame(container): frame = ttk.Frame(container) frame.grid(row=0, column=0, sticky=tk.EW) # 让header框架填满根窗口行宽 header = ttk.Label(frame, text='Header', font=('Arial', 16)) header.grid(row=0, column=0, columnspan=2, sticky=tk.EW, padx=PAD) def _main_frame(container): frame = ttk.Frame(container, style='red.TFrame') frame.grid(row=1, column=0, sticky=tk.NSEW) # 让中间框架填满根窗口分配的所有空间 # 配置行权重:输入行权重1,间隔行权重2,可根据需求调整比例 frame.rowconfigure(0, weight=1) frame.rowconfigure(1, weight=2) frame.rowconfigure(2, weight=1) frame.rowconfigure(3, weight=2) frame.rowconfigure(4, weight=1) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=5) label = ttk.Label(frame, text='label 1') label.grid(row=0, column=0, sticky=tk.NE, padx=PAD, pady=PAD) entry = ttk.Entry(frame) entry.grid(row=0, column=1, sticky=tk.EW, padx=PAD, pady=PAD) label = ttk.Label(frame, text='label 2') label.grid(row=2, column=0, sticky=tk.NE, padx=PAD, pady=PAD) entry = ttk.Entry(frame) entry.grid(row=2, column=1, sticky=tk.EW, padx=PAD, pady=PAD) label = ttk.Label(frame, text='label 3') label.grid(row=4, column=0, sticky=tk.NE, padx=PAD, pady=PAD) entry = ttk.Entry(frame) entry.grid(row=4, column=1, sticky=tk.EW, padx=PAD, pady=PAD) def _button_frame(container) -> None: """Create button row.""" frame = ttk.Frame(container) frame.grid(row=2, column=0, sticky=tk.EW, padx=PAD, pady=PAD) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=10) frame.columnconfigure(2, weight=1) process_button = ttk.Button( frame, text='Save', ) process_button.grid(row=0, column=0, sticky=tk.W) quit_button = ttk.Button(frame, text='Quit', command=dismiss) quit_button.grid(row=0, column=2, sticky=tk.E) def dismiss(): root.grab_release() root.destroy() root = tk.Tk() # style = ttk.Style() # style.configure('TFrame', background='yellow') # style.configure('blue.TFrame', background='blue') # style.configure('green.TFrame', background='green') # style.configure('red.TFrame', background='red') # 根窗口行权重配置:header占小部分,中间占大部分,按钮行固定不拉伸 root.rowconfigure(0, weight=1) root.rowconfigure(1, weight=10) root.rowconfigure(2, weight=0) root.columnconfigure(0, weight=1) _header_frame(root) _main_frame(root) _button_frame(root) root.mainloop()
效果说明
- 垂直调整窗口大小时,Header保持在顶部,按钮行固定在底部。
- 中间区域的输入项会保持在各自行的顶部位置,行与行之间的空白区域按设置的权重比例自动扩展,实现整体按比例填充剩余空间的效果。
- 水平调整时的原有表现保持不变:Header居中、输入框填充分配空间、Save按钮居左、Quit按钮居右。
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

