首页 > 解决方案 > 在 tkinter 中用相邻的笔记本填充水平空间

问题描述

我是 tkinter 的新手,我无法让笔记本填充水平空间。我想将两个笔记本并排放置在窗口顶部。每个笔记本应占据窗口水平空间的一半。

我最初尝试使用pack,但这使得笔记本扩展不均匀,右侧笔记本占用的空间比左侧笔记本多。我认为这样grid会更好,但我不知道如何让它们扩展,即使传递weight=1columnconfigure.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry("800x100")

status = tk.Frame(root)

left_tabs = ttk.Notebook(status)
tab_a = tk.Frame(left_tabs)
tab_b = tk.Frame(left_tabs)
left_tabs.add(tab_a, text="a")
left_tabs.add(tab_b, text="b")
# left_tabs.pack(side=tk.LEFT, fill=tk.X, expand=True)
left_tabs.grid(row=0, column=0)

right_tabs = ttk.Notebook(status)
tab_c = tk.Frame(right_tabs)
tab_d = tk.Frame(right_tabs)
tab_e = tk.Frame(right_tabs)
right_tabs.add(tab_c, text="c")
right_tabs.add(tab_d, text="d")
right_tabs.add(tab_e, text="e")
# right_tabs.pack(side=tk.LEFT, fill=tk.X, expand=True)
right_tabs.grid(row=0, column=1)

tk.Label(tab_a, text="testing").pack()
tk.Label(tab_c, text="testing").pack()

status.columnconfigure(0, weight=1)
status.columnconfigure(1, weight=1)
status.pack(fill=tk.X)

title = tk.Label(root, text="title", bg="grey")
title.pack(fill=tk.X)

tk.mainloop()

标签: pythontkinter

解决方案


要使网格布局的所有列具有相同的宽度,您必须将这些列配置为具有相同的权重并处于相同的位置uniform group。此配置与主小部件相关联,而不是任何包含的小部件(因为列可以包含许多小部件,当然)。

定义如果结果单元格比小部件本身大时如何扩展小部件。这可以是常数 S、N、E 和 W 或 NW、NE、SW 和 SE 的任意组合。

例如,W (west) 表示小部件应与左单元格边框对齐。W+E 表示小部件应水平拉伸以填充整个单元格。W+E+N+S 表示小部件应该双向展开。默认是在单元格中居中小部件。

sticky在执行网格时指定参数:

left_tabs.grid(row=0, column=0, sticky="NESW")
status.columnconfigure(0, weight=1, uniform="group_name")


right_tabs.grid(row=0, column=1, sticky="NESW")
status.columnconfigure(1, weight=1, uniform="group_name")

推荐阅读