Python 查找已使用锚以外的其他锚的位置

Python 查找已使用锚以外的其他锚的位置,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我已经创建了一个代码来显示我的问题。看起来是这样的: 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, tex

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

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")
问题是,我已经将一些文本对齐在中心的一个尺寸上,并在另一侧对齐一个按钮。我想知道文本的西北锚的位置,以确保所有内容都与中心保持相同的距离,并且仍然对齐。

grid()
pack()
的“精度”足以满足大多数需要。您只需要学习如何充分正确使用这些几何图形管理器。事实上,使用
place()
几乎从来都不是你需要的。它有自己的case用法,但对于一般的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,权重=1)

然后我们得到这个影响:

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

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

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

正如您在上面的图像中看到的,根据您设置了权重的行和列,行和列将相应地调整大小。我们使用上述代码实现的是调整第0行和第2行的大小,以及调整第0列和第2列的大小<代码>第1行第1列不会调整大小。因此,这意味着我们在
第1行第1列中放置的任何东西都不会调整大小,而是保持其相对于边框的相对位置。因为我们在
第1行第1列
位置设置了一个框架小部件,然后在框架内设置了所有小部件,所以我们有效地将
第1行第1列
设置为中心

行和列的数量与您告诉它的数量相同。Tkinter将根据您所说的内容自动调整总行数和总列数。除此之外,它还将使没有任何内容的行和列的大小为零。这意味着只有包含内容的行和列(小部件)才会真正影响网格的大小

假设我们有3行3列。根据我们的填充方式,它将改变显示内容的大小

在这个例子中,只要你看到一个
X
,我们就会在下面的行和列中放置一些东西

在这个例子中,我们有(0,0),(1,1)和(2,2)中的内容

在这个例子中,我们在(0,0)和(2,2)中有一些东西

在本例中,我们有(1,0)、(2,1)和(2,2)中的内容

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

至于像
sticky
这样的参数,它们用于管理每个小部件的行为。例如,如果我们告诉小部件填充给定行/列中的所有空间,那么我们将使用
sticky='nsew'
。如果我们想让一个小部件在给定的行/列中水平延伸,而不是垂直延伸,我们将使用
sticky='ew'
表示东/西。请记住,粘性参数用于
grid()
pack()
几何图形管理器有自己的参数

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

以下面的例子为例。此代码将始终设置窗口的标签和按钮,即使在调整窗口大小时也是如此。这比地点更容易管理

您可以在几何图形管理器中使用许多有用的参数来实现您想要的任何行为或对齐。花点时间深入研究一下。我知道
place()

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

如果您刚刚在学习tkinter,我强烈建议您学习
grid
pack
而不是
place
。你为自己做了很多额外的工作。我已经试过了,但不幸的是我发现它们“不精确”。由于无休止的网格,我无法理解它的意义。pack函数对我来说似乎没有任何参数,但我可能误解了什么。不过,谢谢你,你在这个网站上的许多回答确实帮助了我。
grid()
pack()
非常精确。你只是还不知道如何实现你想要的。在这里和网上有很多关于你的问题的例子。事实上,我认为网格和包是不精确的,这就是重点。您将小部件相对放置,tkinter会为您完成所有计算。您不应该关心标签以100px结束,条目以120开始,您应该只关心标签在左侧,条目在右侧<代码>位置
对于最基本的布局来说当然更容易学习,但是如果你需要用户界面响应,它很快就会变成一个泥潭。@BryanOakley我想我的措辞可能需要一些工作
grid()
pack()
设置起来更简单、更快
         0       1       2
     *-------*-------*-------*
     |       |       |       |
   1 |   X   |       |       |
     |       |       |       |
     *-------*-------*-------*
     |       |       |       |
   2 |       |   X   |   X   |
     |       |       |       |
     *-------*-------*-------*
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()
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()