小部件的 tkinter 放置

tkinter placement of widgets

考虑以下简单代码:

    from tkinter import *

    mainFrame = Frame(parent, bd=5, bg="yellow").pack(expand=True,fill=BOTH)

    frameA = Frame(mainFrame, bd=5, bg="green").place(anchor=NW, relx=0, rely=0 , relwidth=1.0, height=40)
    my_label = Label(mainFrame, text="Hello world ", bg="red").place(in_=frameA, relx=0, anchor=NW, rely=0, relwidth=0.5)

    frameB = Frame(frameA, bd=5, bg="gold").place(in_=frameA , anchor=N, relx=0.5, rely=0.8, width=30, height=50)

结果如下所示:

黄框是有道理的,是我所期望的。 frameA(绿色)和 my_label.

也是如此

然而,frameB 拒绝做我期望的事情,最初我有 rely=1.0 作为它的放置命令,我期望它的 N(顶部中心边缘)被放置在底部的水平中点(1.0*高度) 的绿色框架,我已将其设置为它的父级并用作 .place() 命令 _in 参数。

无论我用于实例化 frameB 的 root 参数还是上述 in_ 参数,frameB 的依赖似乎一直放在 w.r.t 大型机或 root 上。

我知道我可以使用 .pack(),但我正在尝试了解 .place() 的行为,所以请不要让我既不使用 .pack() 也不使用 .grid()。

我做错了什么?或(更糟)误解 ?

pack()grid()place()returnNone,因此赋值frameA = Frame(bla bla).place(bla),就是赋值NoneframeA

您需要分两步完成此操作才能获得所需内容:

  • 首先创建小部件。
  • 第二名。

大致如下:

mainFrame = Frame(parent, bd=5, bg="yellow")
mainFrame.pack(expand=True,fill=BOTH)

frameA = Frame(mainFrame, bd=5, bg="green")
frameA.place(anchor=NW, relx=0, rely=0 , relwidth=1.0, height=40)

my_label = Label(mainFrame, text="Hello world ", bg="red")
my_label.place(in_=frameA, relx=0, anchor=NW, rely=0, relwidth=0.5)

frameB = Frame(frameA, bd=5, bg="gold")
frameB.place(in_=frameA , anchor=N, relx=0.5, rely=0.8, width=30, height=50)