【问题标题】:tkinter placement of widgets小部件的 tkinter 放置
【发布时间】:2017-10-02 10:45:03
【问题描述】:

考虑以下简单代码:

    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 拒绝执行我期望的操作,最初我将其放置命令依赖 = 1.0,并且我希望将其 N(顶部中心边缘)放置在底部的水平中点(1.0*height)我设置为它的父级并用作它的绿色框架 .place() 命令 _in 参数。

无论我用于实例化 frameB 的 root 参数或所述 in_ 参数如何,frameB 的依赖似乎一直被放置在大型机或 root 上。

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

我做错了什么?还是(更糟糕的)误解?

【问题讨论】:

标签: python tkinter tkinter-layout


【解决方案1】:

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)

【讨论】:

  • 太棒了。这正是问题所在。我徘徊为什么他们不返回自我...
  • @epeleg,因为place 本身是Place 类的方法(GridPack 相同),那么为什么它应该返回self?无论如何,它可以返回一个小部件(self._w),但是这种行为是否有意义,除了可能构建一个函数调用链,其中所需的小部件连续返回两次?
  • 我想说,恕我直言,创建一个小部件并将其打包/网格/放置在单个操作(代码行)中是有意义的,特别是如果创建不使用很多参数并且仍然想要拥有供以后使用的参考。可能是因为我来自其他语言,这种类型的链接非常常用。
  • @epeleg,公平点。但是,正如您所看到的,Python 并没有分享您对 Java(JScript/JQuery)世界的热情,但是.. 可以以一种或另一种方式实现正确的链接(隐含或什至 explicitly 以满足个人需求),但是我认为这种权衡是不公平的。无论如何,互联网上有很多关于它的信息,所以你并不孤单! (;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
相关资源
最近更新 更多