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

如何让Python Tkinter应用自适应窗口大小,消除空白区域?

Tkinter窗口自适应问题解决方法

我用Python开发了一款Tkinter应用,希望窗口大小调整时控件能自动适配填满整个窗口,但拖动窗口放大时,边框处会出现灰色空白区域填充间隙。

以下是去除无关细节后的代码:

import tkinter as tk
from tkinter import ttk
import openpyxl


root = tk.Tk()

frame = ttk.Frame(root)
frame.pack()

widgets_frame = ttk.LabelFrame(frame, text = "Insert Data")
widgets_frame.grid(row = 0, column = 0, padx = 20, pady = 10)

day_label = ttk.Label(widgets_frame, text = "Date")
day_label.grid(row = 1, column = 0, padx = 5, pady = (0, 5), sticky = "ew")
day_entry = ttk.Entry(widgets_frame)
day_entry.grid(row = 2, column = 0, padx = 5, pady = (0, 5), sticky = "ew") 

walking_entry = ttk.Entry(widgets_frame)
walking_entry.insert(0, "Walking duration (min)")
walking_entry.bind("<FocusIn>", lambda e: walking_entry.delete('0', 'end'))
walking_entry.grid(row = 3, column = 0, padx = 5, pady = (0, 5), sticky = "ew")

button = ttk.Button(widgets_frame, text = "Insert")
button.grid(row = 4, column = 0, padx = 5, pady = 5, sticky = "nsew")

treeFrame = ttk.Frame(frame)
treeFrame.grid(row = 0, column = 1, pady = 10)
treeScroll = ttk.Scrollbar(treeFrame)
treeScroll.pack(side = "right", fill = "y")

cols = ("Day", "Walking")

treeview = ttk.Treeview(treeFrame, show = "headings", yscrollcommand = treeScroll.set, columns = cols, height = 13)
treeview.column("Day", width = 100)
treeview.column("Walking", width = 50)
treeview.pack()
treeScroll.config(command = treeview.yview)

root.mainloop()

我曾添加以下代码(某论坛称其可在窗口放大时让控件均等扩展),但未发现任何变化:

root.grid_columnconfigure(0,weight = 1)
root.grid_columnconfigure(1,weight = 1)
root.grid_rowconfigure(0, weight = 1)
root.grid_rowconfigure(1, weight = 1)
root.grid_rowconfigure(2, weight = 1)
root.grid_rowconfigure(3, weight = 1)
root.grid_rowconfigure(4, weight = 1)

解决步骤:

问题出在布局配置的层级和参数上——你给root配置了grid权重,但root内部的frame是用pack布局的,这些配置根本不会生效。按以下几点修改即可:

  1. 让主frame填满根窗口
    把frame.pack()改成:
frame.pack(fill='both', expand=True)

fill='both'让frame在水平和垂直方向填满父容器,expand=True允许frame随窗口拉伸分配额外空间。

  1. 配置主frame的列权重
    在frame创建后添加:
frame.grid_columnconfigure(0, weight=1)
frame.grid_columnconfigure(1, weight=1)

这会让frame内部的两列(widgets_frame和treeFrame)在窗口放大时平分额外宽度。

  1. 让Treeview填满treeFrame
    把treeview.pack()改成:
treeview.pack(fill='both', expand=True)

这样Treeview会随treeFrame的拉伸而填满整个区域,不会留空白。

  1. 可选:让输入框和按钮占满widgets_frame宽度
    给widgets_frame添加列权重配置:
widgets_frame.grid_columnconfigure(0, weight=1)

同时给widgets_frame和treeFrame的grid方法加上sticky='nsew',让它们能随父容器的拉伸而扩展。


修改后的完整代码:

import tkinter as tk
from tkinter import ttk
import openpyxl


root = tk.Tk()

frame = ttk.Frame(root)
frame.pack(fill='both', expand=True)
# 配置主frame的列权重
frame.grid_columnconfigure(0, weight=1)
frame.grid_columnconfigure(1, weight=1)

widgets_frame = ttk.LabelFrame(frame, text = "Insert Data")
widgets_frame.grid(row = 0, column = 0, padx = 20, pady = 10, sticky='nsew')
# 配置widgets_frame的列权重,让内部控件占满宽度
widgets_frame.grid_columnconfigure(0, weight=1)

day_label = ttk.Label(widgets_frame, text = "Date")
day_label.grid(row = 1, column = 0, padx = 5, pady = (0, 5), sticky = "ew")
day_entry = ttk.Entry(widgets_frame)
day_entry.grid(row = 2, column = 0, padx = 5, pady = (0, 5), sticky = "ew") 

walking_entry = ttk.Entry(widgets_frame)
walking_entry.insert(0, "Walking duration (min)")
walking_entry.bind("<FocusIn>", lambda e: walking_entry.delete('0', 'end'))
walking_entry.grid(row = 3, column = 0, padx = 5, pady = (0, 5), sticky = "ew")

button = ttk.Button(widgets_frame, text = "Insert")
button.grid(row = 4, column = 0, padx = 5, pady = 5, sticky = "nsew")

treeFrame = ttk.Frame(frame)
treeFrame.grid(row = 0, column = 1, pady = 10, sticky='nsew')
treeScroll = ttk.Scrollbar(treeFrame)
treeScroll.pack(side = "right", fill = "y")

cols = ("Day", "Walking")

treeview = ttk.Treeview(treeFrame, show = "headings", yscrollcommand = treeScroll.set, columns = cols, height = 13)
treeview.column("Day", width = 100, stretch=True)
treeview.column("Walking", width = 50, stretch=True)
treeview.pack(fill='both', expand=True)
treeScroll.config(command = treeview.yview)

root.mainloop()

内容的提问来源于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 21:30:30