我创建了一个代码来显示我的问题。它看起来像这样:
userNameID = tkinter.Label(root, text="Name/ID")
userNameID.place(x=640, y=320, anchor="e")
userNameID = tkinter.Label(root, text="Password")
userNameID.place(x=640, y=360, anchor="e")
entButton = tkinter.Button(root, text="Enter", command=enterPrint)
entButton.place(x=640, y=400, anchor="w")
问题是我在中心的一个大小和另一侧的按钮上对齐了一些文本。我想知道西北锚的位置,以确保所有内容都与中心距离相同但仍然对齐。
答案 0 :(得分:5)
grid()
和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()
结果:
在上面的示例中,您将看到在调整窗口大小时窗口小部件不会移动。这是因为我们没有指示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()
。 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=tk.TOP)
tk.Label(center_frame, text="Password").pack(side=tk.TOP)
tk.Button(center_frame, text="Enter").pack(side=tk.RIGHT)
root.mainloop()