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

Tkinter窗口垂直调整时如何让输入区域按比例填充空间?

Tkinter中间区域输入项垂直按比例填充实现方案

当然可行,通过调整网格布局的行权重配置和组件的sticky属性,就能让中间区域的输入项按比例分配垂直剩余空间,避免聚集在窗口中间。

关键修改点

  1. 根窗口行权重调整:按钮行无需垂直拉伸,将其权重设为0,固定在窗口底部;中间区域权重设为较大值,占据大部分垂直空间。
  2. 中间区域布局优化:移除用于占位的空Label,直接通过rowconfigure为输入行和间隔行设置权重,控制行之间的空间比例;同时确保中间区域的Frame能填满根窗口分配的空间。
  3. 组件位置控制:通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:44:50