在tkinter和python中嵌套网格和框架

时间:2017-09-14 02:37:49

标签: python-3.x tkinter

我正在尝试在一个更大网格结构的框架内设置一个网格。我试图将它提炼到最简单的问题版本。

from tkinter import Tk, Frame, Label, Entry

root = Tk()
root.geometry('800x800')


frame1 = Frame(root, width=400, height=400, background="Blue")
frame2 = Frame(root, width=400, height=400, background="Red")

frame1.grid(row=0, column=0)
frame2.grid(row=1, column=1)

label1 = Label(frame1,text='Label1')
label1.grid()

标签不是将标签放在frame1中,而是替换整个网格中的框架:

Sample output

我看过其他例子,但我无法确定他们为什么工作而我的工作没有。

2 个答案:

答案 0 :(得分:2)

框架的width=height=通常仅在没有儿童时适用。添加子窗口小部件后,它会自行调整大小以适应其内容。所以frame1仍然存在,它现在与标签完全相同,并且完全由标签覆盖。

要关闭此自动调整大小的行为,请在框架上调用.grid_propagate(0)(或.pack_propagate(0),具体取决于用于框架儿童的几何管理器。)

答案 1 :(得分:1)

使用jasonharper的观察结果框架自动调整自身大小并发布了类似的问题here,我能够更新代码。

from tkinter import Tk, Frame, Label

root = Tk()
root.geometry('800x800')

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(1, weight=1)
root.grid_columnconfigure(1, weight=1)

frame1 = Frame(root, background="Blue")
frame2 = Frame(root, background="Red")

frame1.grid(row=0, column=0, sticky="nsew")
frame2.grid(row=1, column=1, sticky="nsew")


label1 = Label(frame1,text='Label1')
label1.grid()

我对代码所做的更改是:

  • 我从Frame实例中删除了height和width参数,因为它们无论如何都没有做任何事情。
  • 为根的行和列添加了权重,框架的容器,在可用空间中平均分隔框架
  • 将'sticky'参数添加到框架的网格布局中,以便框架占用所有分配的空间。

结果:

New result