小部件的tkinter放置

时间:2017-10-02 10:45:04

标签: python tkinter tkinter-layout

考虑以下简单代码:

    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)

结果如下: enter image description here

黄色框架有意义,是我的预期。 frameA(绿色)和my_label也一样。

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

看起来,无论我用于实例化frameB或所述in_参数的根参数,都依赖于frameB继续放置w.r.t大型机或root用户。

我知道我可以使用.pack(),但我试图找出.place()的行为,所以请不要让我既不使用.pack()也不使用.grid()。

我做错了什么?或者(更糟)错过理解?

1 个答案:

答案 0 :(得分:2)

pack()grid()place()返回None,因此,分配frameA = Frame(bla bla).place(bla),正在为None分配frameA

您需要分两步完成这项工作才能获得所需:

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

这些方面的东西:

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)