如何让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布局的,这些配置根本不会生效。按以下几点修改即可:
- 让主frame填满根窗口
把frame.pack()改成:
frame.pack(fill='both', expand=True)
fill='both'让frame在水平和垂直方向填满父容器,expand=True允许frame随窗口拉伸分配额外空间。
- 配置主frame的列权重
在frame创建后添加:
frame.grid_columnconfigure(0, weight=1) frame.grid_columnconfigure(1, weight=1)
这会让frame内部的两列(widgets_frame和treeFrame)在窗口放大时平分额外宽度。
- 让Treeview填满treeFrame
把treeview.pack()改成:
treeview.pack(fill='both', expand=True)
这样Treeview会随treeFrame的拉伸而填满整个区域,不会留空白。
- 可选:让输入框和按钮占满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
相关产品推荐
相关产品推荐

