2017-09-14 135 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