Python 是否有一种方法可以使一个位置小部件始终相对于另一个小部件(如Pack)放置

Python 是否有一种方法可以使一个位置小部件始终相对于另一个小部件(如Pack)放置,python,tkinter,widget,resize,frame,Python,Tkinter,Widget,Resize,Frame,因此,我使用place方法使一个小部件与其他小部件重叠,但它的位置相对于使用pack的小部件(使用winfo)。调整父帧大小时,包位置将更改,但放置位置不会更改。 这是我的代码: from tkinter import * root = Tk() root.geometry("200x300") search = Entry(root) search.pack() search.update() x = search.winfo_x() y = search.winfo_

因此,我使用place方法使一个小部件与其他小部件重叠,但它的位置相对于使用pack的小部件(使用
winfo
)。调整父帧大小时,包位置将更改,但放置位置不会更改。 这是我的代码:

from tkinter import *
root = Tk()
root.geometry("200x300")

search = Entry(root)
search.pack()

search.update()
x = search.winfo_x()
y = search.winfo_y()
width = search.winfo_width()
height = search.winfo_height()

frame = LabelFrame(root, width=width, height=200)
frame.place(x=x, y=y+height)

root.mainloop()

调整窗口大小时,LabelFrame保持在其x和y位置。条目小部件将被用作搜索栏,我想在它下面自动完成。条目小部件下会有小部件,自动完成功能只会在您键入时出现(但这不是我想要的。如果您需要的话,它会更详细)。那么,有没有一种方法可以让place小部件始终相对于pack小部件。如果您有任何答案,谢谢:)

如果您的目标是将一个小部件相对于另一个小部件放置,那么,
place
允许您这样做。对于工具提示或其他暂时性的小部件等不适合正常布局的东西来说,它非常有用

最简单的方法是使小部件成为控制小部件的子部件。例如,对于要相对于搜索框放置的框架,可以将其设置为搜索框的子项。如果这样做不方便,您可以使用
in_u
参数告诉
place
哪个小部件是另一个小部件

例如,要将labelframe放置在搜索框的正下方,并与搜索框的宽度相同,可以执行以下操作:

frame.place(
    in_=search,
    bordermode="outside",
    anchor="nw",
    relx=0,
    rely=1.0,
    y=5,
    relwidth=1.0
)
这就是选项的含义:

  • 在搜索中
    :相对于搜索框放置框架
  • bordermode=“outside”
    :相对测量值来自边界外部(默认值为“内部”)
  • anchor=“nw”
    :放置小部件,使框架的西北角位于计算坐标处
  • relx=0
    :将定位点放置在距离搜索框左边缘0%的位置
  • rely=1.0
    :将框架放置在搜索框高度的100%
  • y=5
    :将5个像素添加到计算位置,使其仅浮动在窗口下方一点
  • relwidth=1.0
    :将框架宽度设置为搜索框宽度的100%

显然,您不必使用
y=5
,我只是添加了它来说明使用
rely
y

的加法行为,不清楚您在问什么;标题和最后一句问了两个完全不同的问题。另外,你知道
place
支持相对位置吗?@BryanOakley标题和最后一句是不同的问题,因为我认为两者都有可行的答案(因此我写了“我的问题可能不是最好的答案”)。如果不清楚,我很抱歉。另外,我不知道背包的相对位置,但你会怎么做呢?我使用winfo进行相对放置。不,
pack
没有相对放置,但是
place
有相对放置。如果你能在你的问题中加入一个。仅仅说你想让一个小部件和另一个小部件相对,就可以用许多不同的方式来回答。我知道包不是你的问题。你之前的评论说“我不知道背包的相对位置”。我纠正你们的错误是因为背包并没有相对的位置。你们想要什么还不清楚。您可以使用pack将
直接放在
搜索
下。为什么您认为需要使用
place
?回答关于布局的模糊问题的问题是,布局在很大程度上取决于窗口中的其他内容。如果只有这两个小部件,那么就没有理由使用
place
,除非您的目标是使代码尽可能复杂。