首页 > 解决方案 > 有没有办法让一个地方小部件始终相对于另一个小部件(例如 Pack)

问题描述

所以,我使用 place 方法让一个小部件与其他小部件重叠,但它的位置与winfo使用 pack 的小部件是相对的(with )。当父框架调整大小时,包位置会改变,但放置位置不会改变。这是我的代码:

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 小部件。如果有答案,谢谢:)

标签: pythontkinterwidgetresizeframe

解决方案


如果您的目标是将一个小部件相对于另一个小部件,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,我只是添加它来说明使用relyand的附加行为y


推荐阅读