Python 在网格内设置网格?

Python 在网格内设置网格?,python,tkinter,grid,Python,Tkinter,Grid,如果您能帮助我了解网格几何体管理器,我将不胜感激 这是我想要建立的 我曾想过使用网格,但我找不到任何好的教程,可以清楚地看到 解释如何使用它。 有很多教程,但大部分都是非常简单或真正过时的 我不知道如何只使用网格来构建图中所示的内容,因为 元素彼此嵌套,每个元素都应该在其中容纳更多的元素。 使用网格安排最外层的小部件并不难。我只是将工具栏放在第0行, 然后最外层的窗格(绿色)进入第一行,然后状态栏进入第二行。 在那之后,我需要在绿色窗格内安排事情。 我在绿色窗格窗口的右窗格中放置另一个窗格窗口

如果您能帮助我了解
网格
几何体管理器,我将不胜感激

这是我想要建立的

我曾想过使用网格,但我找不到任何好的教程,可以清楚地看到 解释如何使用它。 有很多教程,但大部分都是非常简单或真正过时的

我不知道如何只使用网格来构建图中所示的内容,因为 元素彼此嵌套,每个元素都应该在其中容纳更多的元素。 使用网格安排最外层的小部件并不难。我只是将工具栏放在第0行, 然后最外层的窗格(绿色)进入第一行,然后状态栏进入第二行。 在那之后,我需要在绿色窗格内安排事情。 我在绿色窗格窗口的右窗格中放置另一个窗格窗口(粉红色),然后 将一个笔记本粘贴到它的顶部窗格中

现在,我需要向这些内部窗格添加更多小部件。例如。我要补充一点 粉红色窗格窗口底部窗格的一些按钮。这就是我遇到问题的地方

如果我试图使用
pack()
在这些最里面的窗格中安排事情,Python会向我尖叫 使用多个几何图形管理器。 但是,当我考虑如何使用
网格
实现这一点时,我就是找不到细分的方法
最里面的窗格变成更小的网格


小部件内部是否存在由外部网格作用的网格?

我发现它大约有两年的历史了,对于您的使用来说可能有点太久了,但它有一些关于在Tkinter中嵌套网格的信息。它建议使用框架嵌套网格,基本上在框架的子对象中包含子对象。在这些框架内,您可以放置对象。

当我看到占据某个区域全宽或全高的小部件时,我通常使用
pack
,因为它是专门设计用于沿空腔一侧放置对象的。您可以使用
grid
,但它需要额外的代码,因为您必须添加小部件并配置行和列。使用
pack
只需添加小部件

例如,很明显,您希望底部有一个状态栏,时间上有一个工具栏,中间有一个窗格小部件。因此,从这一点开始,如下例所示:

import tkinter as tk

root = tk.Tk()
root.geometry("600x400")

toolbar = tk.Frame(root, background="#d5e8d4", height=40)
statusbar = tk.Frame(root, background="#e3e3e3", height=20)
main = tk.PanedWindow(root, background="#99fb99")

toolbar.pack(side="top", fill="x")
statusbar.pack(side="bottom", fill="x")
main.pack(side="top", fill="both", expand=True)

root.mainloop()
注:宽度、高度和颜色添加到框架中用于说明,否则,空框架的大小将为1x1。在框架内添加小部件后,可以删除
宽度
高度
选项

你说右边有一个窗格窗口,所以把它加在右边。我们将在左侧使用普通帧

left_pane = tk.Frame(main, background="#99fb99", width=100)
right_pane = tk.PanedWindow(main, background="#99fb99", width=200)
main.add(left_pane)
main.add(right_pane)

接下来,将两个窗格添加到右侧。为了能用尽可能少的代码显示颜色,我将使用顶部的框架而不是笔记本:

notebook = tk.Frame(right_pane, background="#99ceff", height=70)
bottom_right = tk.Frame(right_pane, background="#ffe6cd", height=50)
right_pane.add(notebook)
right_pane.add(bottom_right)

话虽如此,如果您愿意,您可以使用
grid
。诀窍是使用中间帧,因为任何小部件中的布局都独立于父或子小部件中的布局

您只需删除对
pack
的前三个调用,并将其替换为以下五行:

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
toolbar.grid(row=0, column=0, sticky="ew")
main.grid(row=1, column=0, sticky="nsew")
statusbar.grid(row=2, column=0, sticky="ew")
由于其他窗口小部件是窗格窗口小部件的子部件,因此无需其他操作。添加到每个窗格中的任何小部件都有各自独立的布局区域,因此您可以在每个框架内使用
网格
打包
、或
放置

为了说明这一点,我将使用
grid
添加几行和几列正方形:

for row in range(6):
    for column in range(30):
        f = tk.Frame(bottom_right, background="white",
                     bd=2, relief="raised", width=10, height=10)
        f.grid(row=row, column=column)

不错!谢谢你,迈克尔。我正在考虑使用框架。您是否有理由只使用
grid
?使用
pack
pack
grid
的组合,这种特定布局会更容易。为什么只想使用
网格
?使用
网格
Geometry管理的嵌套
框架
的行和列是相互独立的,因此嵌套它们是您想要做的常见方式。嗨,Bryan。没有特别的原因。我只需要选择一个几何管理器来使用,我已经读遍了网格是最通用的。关于嵌套框架和网格的这一特殊信息是我所缺少的,无法取得任何进展。