查找除已使用的锚以外的另一个锚的位置

Sni*_*gie 3 python tkinter python-3.x

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

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")
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*SMT 5

grid()pack()有“precises”足以满足大多数需求。您只需要学习如何充分利用这些几何管理器即可。实际上,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()
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明 在此处输入图片说明

在上面的示例中,您将看到在调整窗口大小时小部件不会移动。这是因为我们没有指示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   |
     |       |       |       |
     *-------*-------*-------*
Run Code Online (Sandbox Code Playgroud)

在此示例中,我们在(0,0)和(2,2)中包含一些内容。

         0       2
     *-------*-------*
     |       |       |
   0 |   X   |       |
     |       |       |
     *-------*-------*
     |       |       |
   2 |       |   X   |
     |       |       |
     *-------*-------*
Run Code Online (Sandbox Code Playgroud)

在此示例中,我们在(1,0),(2,1)和(2,2)中包含一些内容。

         0       1       2
     *-------*-------*-------*
     |       |       |       |
   1 |   X   |       |       |
     |       |       |       |
     *-------*-------*-------*
     |       |       |       |
   2 |       |   X   |   X   |
     |       |       |       |
     *-------*-------*-------*
Run Code Online (Sandbox Code Playgroud)

上面的示例说明了根据您用小部件填充的行和网格自动显示的内容。

至于sticky这些参数,则用于管理每个小部件的行为。例如,如果我们告诉小部件填充给定行/列中的所有空间,则可以使用sticky="nsew"。如果我们希望窗口小部件水平地而不是垂直地在给定的行/列中拉伸,则可以使用sticky="ew"东西。请记住,粘性说法是针对的grid()。该pack()几何管理器有它自己的论点。

有很多选项,您可以在这里找到它们的列表及其说明:

对于 grid()

对于 pack()

请看下面的例子。即使您调整窗口大小,此代码也将始终设置窗口的标签和按钮百分比。这比地方容易管理得多。

您可以在几何管理器中使用许多有用的参数来实现所需的任何行为或对齐。只是花一些时间来研究它。我知道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()
Run Code Online (Sandbox Code Playgroud)

这是使用的示例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()
Run Code Online (Sandbox Code Playgroud)

  • @ReblochonMasque:任何时候您需要放置一个具有绝对位置或相对于另一个小部件的绝对位置的小部件,并且不影响或不受其他小部件的影响。例如,将图像添加为框架或顶层的背景。为调整大小创建一点抓地力。工具提示是另一个潜在的用途。这对于创建MDI(多个文档界面,在另一个窗口中有多个可独立移动的窗口)很有用。通用用途不多,但几种特殊用途。 (2认同)