grid()
and pack()
“精确”足以满足大多数需求。您只需要学习如何充分正确地使用这些几何管理器。事实上使用place()
几乎从来都不是你所需要的。它有它的用途,但对于一般 GUI 设置来说它不是一个很好的选择。更新代码也很难管理。
更新:回答您在评论中的问题:
行配置意味着你因为权重而将每一行设置为 1 像素?我知道我可以在整个过程中绘制一个网格,但我不知道我的程序有多少行、多少列。所以我找不到中心。
权重用于告诉特定的行或列应相对于同一网格/容器内它们周围的其他行和列以一定的比例调整大小。默认权重为零。当我们将权重设置为 1 时,该行或列将随窗口以均匀的速率调整大小。
以这个示例代码为例:
import tkinter as tk
root=tk.Tk()
center_frame = tk.Frame(root)
center_frame.grid(row=1, column=1, sticky='nsew')
tk.Label(center_frame, text='Name/ID').grid(row=0, column=0)
tk.Label(center_frame, text='Password').grid(row=1, column=0)
tk.Button(center_frame, text='Enter').grid(row=2, column=1)
root.mainloop()
Results:
在上面的示例中,您将看到当您调整窗口大小时,小部件不会移动。这是因为我们没有指示 tkinter 允许移动任何行或列。
如果我们将此权重添加到程序中root.rowconfigure(0, weight=1)
:
然后我们得到这样的效果:
接下来添加这个root.rowconfigure(2, weight=1)
:
接下来添加这个root.columnconfigure(0, weight=1)
:
接下来添加这个root.columnconfigure(2, weight=1)
:
正如您在上面的图像中看到的那样,根据您设置了权重的行和列,行和列将相应地调整大小。我们通过上面的代码实现的是调整第 0 行和第 2 行的大小以及调整第 0 行和第 2 列的大小。row 1 column 1
不会调整大小。所以这意味着我们放置在row 1 column 1
位置不会调整大小,而是保持其与边框的相对位置。因为我们在row 1 column 1
位置,然后是我们有效制作的框架内的所有小部件row 1 column 1
中心。
行和列的数量与您指定的数量一样多。 Tkinter 将根据您所说的内容自动调整总行数和总列数。除此之外,它还会使没有任何内容的行和列的大小为零。这意味着只有包含内容(小部件)的行和列才会真正影响网格的大小。
假设我们有 3 行和 3 列。根据我们填充的方式,它会改变显示内容的大小。
在此示例中,您在任何地方看到X
显示我们在下面的行和列中放置了一些内容。
在此示例中,我们在 (0,0)、(1,1) 和 (2,2) 中有一些内容。
ROW
0 1 2
*-------*-------*-------*
| | | |
0 | X | | |
C | | | |
O *-------*-------*-------*
L | | | |
U 1 | | X | |
M | | | |
N *-------*-------*-------*
| | | |
2 | | | X |
| | | |
*-------*-------*-------*
在此示例中,我们在 (0,0) 和 (2,2) 中有一些内容。
0 2
*-------*-------*
| | |
0 | X | |
| | |
*-------*-------*
| | |
2 | | X |
| | |
*-------*-------*
在此示例中,我们在 (1,0)、(2,1) 和 (2,2) 中有一些内容。
0 1 2
*-------*-------*-------*
| | | |
1 | X | | |
| | | |
*-------*-------*-------*
| | | |
2 | | X | X |
| | | |
*-------*-------*-------*
上面的示例说明了根据您用小部件填充的行和网格自动显示的内容。
至于像这样的论点sticky
这些用于管理每个小部件的行为。例如,如果我们告诉一个小部件填充给定行/列中的所有空间,那么我们将使用sticky='nsew'
。如果我们希望一个小部件在给定的行/列中水平但不垂直地拉伸,我们将使用sticky='ew'
对于东/西。请记住粘性参数是为了grid()
. The pack()
几何管理器有它自己的论据。
有很多选项,您可以在此处找到它们的列表及其描述:
For grid()
For pack()
以下面的例子为例。即使您调整窗口大小,此代码也将始终设置窗口的标签和按钮中心。这比地点更容易管理。
您可以在几何管理器中使用许多有用的参数来实现您想要的任何行为或对齐方式。只需花时间深入研究即可。我知道place()
感觉像是最好的选择(在布莱恩纠正这个想法之前我第一次开始时也这么认为:D)但事实并非如此。
import tkinter as tk
root=tk.Tk()
root.rowconfigure(0, weight=1)
root.rowconfigure(2, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(2, weight=1)
center_frame = tk.Frame(root)
center_frame.grid(row=1, column=1, sticky='nsew')
tk.Label(center_frame, text='Name/ID').grid(row=0, column=0)
tk.Label(center_frame, text='Password').grid(row=1, column=0)
tk.Button(center_frame, text='Enter').grid(row=2, column=1)
root.mainloop()
这是一个使用的示例pack()
。我发现grid()
是我要去的但是pack()
也可以用来完成很多事情。
import tkinter as tk
root=tk.Tk()
center_frame = tk.Frame(root)
center_frame.pack(expand=True)
tk.Label(center_frame, text='Name/ID').pack(side='top')
tk.Label(center_frame, text='Password').pack(side='top')
tk.Button(center_frame, text='Enter').pack(side='right')
root.mainloop()