2017-09-14 89 views
0

我试图在更大的网格结构中设置框架内的网格。我试图将其提炼成最简单的问题。在tkinter和python中嵌套网格和框架

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() 

不是把标签帧1内的,用标签替换框架整体电网:

Sample output

我看其他的例子,但我一直没能以确定他们为什么工作,而我的工作没有。

回答

2

Frame的width=height=通常只适用于没有孩子的情况。一旦添加了子窗口小部件,它就会调整其大小以适应其内容。因此frame1仍然存在,它现在与标签尺寸完全相同,并且完全由标签覆盖。

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

+0

虽然,关闭几何传播是几乎从不正确的解决方案。使用它通常意味着您必须做更多的工作来作为程序员来创建一个响应程序,并且在不同的分辨率和不同的字体下运行良好。 –

+0

那么Brian的方法是什么? –

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() 

,我对代码所做的更改是:

  • 我删除从框架实例的高度和宽度参数,因为他们没有做任何事情反正。
  • 在根的行和列中添加了加权,这些帧的容器将空间等分在可用空间中
  • 将'sticky'参数添加到帧的网格布局中,以便帧将采用分配他们分配的所有空间。

其结果是:

New result