我有一个 tkinter 应用程序,包含三个主要水平区域:
- 标头
- 一系列标签和条目
- 一排按钮
当我水平调整窗口大小时,该应用程序运行良好:
- 标题保持在中心
- 条目扩展以填充分配的空间
- “保存”按钮位于左侧,“取消”按钮位于右侧
但是当我垂直调整大小时,我很高兴:
- 标题保持在顶部
- 按钮留在底部
但是,我希望条目以某种比例方式展开以填充剩余空间,而不是聚集在中心。这可能吗?
import tkinter as tk
from tkinter import ttk
PAD = 5
def _header_frame(container):
frame = ttk.Frame(container)
frame.grid(row=0, column=0)
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.EW)
frame.rowconfigure(0, weight=1)
frame.rowconfigure(1, weight=10)
frame.rowconfigure(2, 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)
entry = ttk.Entry(frame)
entry.grid(row=0, column=1, sticky=tk.EW, padx=PAD)
padding = ttk.Label(frame, text='')
padding.grid(row=1, column=0)
label = ttk.Label(frame, text='label 2')
label.grid(row=2, column=0, sticky=tk.SE, padx=PAD)
entry = ttk.Entry(frame)
entry.grid(row=2, column=1, sticky=tk.EW, padx=PAD)
padding = ttk.Label(frame, text='')
padding.grid(row=3, column=0)
label = ttk.Label(frame, text='label 3')
label.grid(row=4, column=0, sticky=tk.SE, padx=PAD)
entry = ttk.Entry(frame)
entry.grid(row=4, column=1, sticky=tk.EW, padx=PAD)
def _button_frame(container) -> None:
"""Create button row."""
frame = ttk.Frame(container)
frame.grid(row=3, 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)
padding = ttk.Label(frame, text='')
padding.grid(row=0, column=1)
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')
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=10)
root.rowconfigure(2, weight=1)
root.columnconfigure(0, weight=1)
_header_frame(root)
_main_frame(root)
_button_frame(root)
root.mainloop()
首先,您需要将根窗口的第 1 行配置为粘附到分配给它的空间的所有四个边缘。
接下来,如果您希望将行展开,那么您需要为每一行赋予相同的非零权重。
最后,您可能想要删除标签和条目的自定义填充,因为填充会自动发生,但如果您需要额外的填充,可以保留它。此外,您需要将该
sticky
值调整为相同或将其完全删除。您还可以删除用于填充的额外标签。就我个人而言,我发现当所有布局代码放在一起时,布局问题更容易解决。最终结果如下所示:
这是一个屏幕截图,其中窗口从其原始大小扩展,以便您可以看到小部件是如何均匀分布的。