Tkinter组件未填满框架及同权重框架尺寸异常问题咨询
Tkinter布局问题解答
以下是你的代码:
import tkinter as tk from tkinter import ttk from tkinter import messagebox root = tk.Tk() root.title("Food shopping") root.geometry('800x500') root.columnconfigure(0, weight=1) root.columnconfigure(1, weight=1) # root.columnconfigure(2, weight=1) root.rowconfigure(0, weight=1) root.rowconfigure(1, weight=1) # Blank space top left frame1 = tk.Frame(root) frame1.configure(bg='red') frame1.grid(row=0, column=0, sticky='nswe', padx=5, pady=5) # Frame containing the 4 buttons frame2 = tk.Frame(root) frame2.configure(bg='blue') frame2.grid(row=0, column=1, sticky="nswe", padx=5, pady=5) # Frame containing the first check boxes frame3 = tk.Frame(root) frame3.configure(bg='green') frame3.grid(row=1, column=0, sticky="nswe", padx=5, pady=5) entry_btn = ttk.Button(frame2, text="Add") entry_btn.grid(row=0, column=0, sticky='we') entry_btn2 = ttk.Button(frame2, text="Clear") entry_btn2.grid(row=0, column=1, sticky='we') entry_btn3 = ttk.Button(frame2, text="Continue") entry_btn3.grid(row=0, column=2, sticky='we') entry_btn4 = ttk.Button(frame2, text="Finish") entry_btn4.grid(row=1, column=0, columnspan=3, sticky='we') root.mainloop()
问题解答
1. 蓝色框架内的按钮为何无法填满整个框架?
你只给根窗口root的行列设置了权重,但蓝色框架(frame2)自身的行列没有配置权重。grid布局默认会根据内部组件的最小尺寸分配空间,不会自动拉伸填充父容器。要让按钮填满frame2,需要给frame2的列和行设置weight属性:
# 给frame2的三列设置均等权重,让横向空间均匀分配 frame2.columnconfigure(0, weight=1) frame2.columnconfigure(1, weight=1) frame2.columnconfigure(2, weight=1) # 给frame2的两行设置均等权重,让纵向空间均匀分配 frame2.rowconfigure(0, weight=1) frame2.rowconfigure(1, weight=1)
同时可以给按钮加上sticky='nswe',让按钮在垂直方向也填满对应单元格,这样就能让按钮完全填充蓝色框架了。
2. 蓝色框架与其他同权重框架相比尺寸为何更大?
Tkinter的grid布局会优先满足组件的最小尺寸需求,再按weight分配剩余空间。蓝色框架(frame2)内部有4个带文本的按钮,这些按钮本身有固定的最小宽度,导致frame2的最小宽度比空的红色框架(frame1)要大。虽然根窗口的列0和列1权重都是1,但列1需要先分配足够容纳frame2最小宽度的空间,剩下的宽度才会按1:1分配,最终就出现frame2比frame1尺寸更大的情况。
如果要让两个框架严格等宽,可以给frame1设置minsize,强制它的最小宽度和frame2一致,或者确保两个框架内部的最小尺寸相同。
内容的提问来源于stack exchange,提问作者SockWhisperer
相关产品推荐
相关产品推荐

