有没有办法总是有一个相对于另一个小部件(例如Pack)的放置小部件

时间:2020-08-27 19:54:44

标签: 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_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位置。 Entry小部件将用作搜索栏,我想在其下自动完成。条目小部件下面将有小部件,并且自动补全功能仅在您键入时才会显示(尽管这不是我想要的,但如果需要的话,它只是个补充说明)。因此,有没有一种方法可以使Place窗口小部件始终相对于pack窗口小部件。如果您有任何答案,谢谢:)

1 个答案:

答案 0 :(得分:1)

如果您的目标是将一个小部件相对于另一个小部件,则place允许您这样做。对于工具提示或其他暂时不适合常规布局的瞬态小部件之类的东西来说,这非常好。

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

例如,要将标签框直接放置在搜索框下方,并与搜索框具有相同的宽度,您可以执行以下操作:

frame.place(
    in_=search,
    bordermode="outside",
    anchor="nw",
    relx=0,
    rely=1.0,
    y=5,
    relwidth=1.0
)

这是什么意思:

  • in_=search:相对于搜索框放置框架
  • bordermode="outside":相对测量是从边界的外部进行的(默认为“内部”)
  • anchor="nw":放置窗口小部件,以使框架的西北角位于计算出的坐标上
  • relx=0:将锚点从搜索框的左边缘放置0%
  • rely=1.0:将框架放置在搜索框高度的100%
  • y=5:将5个像素添加到计算出的位置,使其漂浮在窗口下方一点点
  • relwidth=1.0:将框架的宽度设为搜索框宽度的100%。

很明显,您不必使用y=5,我只是添加了它来说明使用relyy的累加行为。