找到另一个锚的位置,而不是已经使用的锚

2024-10-04 11:36:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个代码来显示我的问题。看起来像这样:

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")

问题是我把一些文本放在中心的一个尺寸上,按钮在另一边。我想知道文本的西北锚的位置,以确保所有内容与中心的距离相同,并且仍然对齐。在


Tags: 代码textname文本idtkinterplacebutton
1条回答
网友
1楼 · 发布于 2024-10-04 11:36:18

grid()和{}足够满足大多数需求。您只需要学习如何充分利用这些几何图形管理器。事实上,place()的使用几乎永远不是你所需要的。它有它的案例用途,但对于一般的GUI设置来说,它不是一个好的选择。更新代码也很难管理。在

更新:在评论中回答您的问题:

Row configure means that you put every row to be 1 pixel because of the weight? I know I can draw a grid over the whole thing but I don't know how many rows, columns my program has. therefore I can't find the center.

权重用于指示特定行或列的大小应相对于同一网格/容器中它们周围的其他行和列按一定比例调整大小。默认权重为零。当我们将权重设置为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()

结果:

enter image description hereenter image description here

在上面的示例中,您将看到当您调整窗口大小时,小部件不会移动。这是因为我们没有指示tkinter允许任何行或列移动。在

如果我们把这个权重加到程序中root.rowconfigure(0, weight=1)

然后我们得到这样的影响:

enter image description here

接下来添加这个root.rowconfigure(2, weight=1)

enter image description here

接下来添加这个root.columnconfigure(0, weight=1)

enter image description here

接下来添加这个root.columnconfigure(2, weight=1)

enter image description here

正如您在上面的图像中看到的,取决于您设置了权重的行和列,那么行和列将相应地调整大小。我们用上面的代码实现的是调整行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)中的内容。在

^{pr2}$

在这个例子中,我们在(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"表示东/西。请记住,sticky参数是针对grid()pack()几何图形管理器有它自己的参数。在

有许多选项,您可以在此处找到它们的列表及其说明:

For ^{}

For ^{}

以下面的例子为例。这段代码将在任何时候设置窗口的标签和按钮,即使你调整窗口的大小。这比地方容易管理得多。在

可以在几何图形管理器中使用许多有用的参数,以实现您希望的任何行为或对齐。花点时间好好研究一下。我知道place()感觉是最好的选择(在Bryan纠正这个概念之前,我第一次开始的时候也是这样想的: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()是我的目标,但是{}也可以用来完成很多工作。在

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()

相关问题 更多 >