如何在 Tkinter 中创建嵌套网格?

How can I create a nested grid in Tkinter?

我正在使用 tkinter 并尝试将一些框架放入大型机的网格中。 在这些框架内,我想将新的小部件放入新的网格中。但问题是:tkinter 认为“新”网格的行和列仍然是来自大型机的旧网格。如何在嵌套网格中组织它们?

from tkinter import *
from tkinter import ttk

root = Tk()
mainframe = ttk.Frame(root)
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

upper_frame = ttk.Frame(mainframe).grid(row=0, column=0, sticky=(N, W))
lower_frame = ttk.Frame(mainframe).grid(row=1, column=0, sticky=(N, W))

label_1 = ttk.Label(upper_frame, text="Northwest ").grid(row = 0, column = 0)
label_2 = ttk.Label(upper_frame, text="Northeast ").grid(row = 0, column = 1)
label_3 = ttk.Label(lower_frame, text="Southwest ").grid(row = 0, column = 0)
label_4 = ttk.Label(lower_frame, text="Southeast ").grid(row = 0, column = 1)

root.mainloop()

注意这一行:

upper_frame = ttk.Frame(mainframe).grid(row=0, column=0, sticky=(N, W))

与下面的结果相同:

x = ttk.Frame(mainframe)
upper_frame = x.grid(row=0, column=0, sticky=(N, W))

所以 upper_frame.grid(...) 的结果,即 None

使用 None 作为小部件的父项将使小部件成为 root window 的子项。所以这些标签是根 window 的子代,而不是预期的 upper_framelower_frame.

您需要拆分线:

upper_frame = ttk.Frame(mainframe).grid(row=0, column=0, sticky=(N, W))

分成两行:

upper_frame = ttk.Frame(mainframe)
upper_frame.grid(row=0, column=0, sticky=(N, W))

同样适用于 lower_frame