2015-11-06 183 views
1

我玩Tkinter的框架佈局。我從Bryan yestarday得到了一個偉大的贊助者,不幸的是我遇到了填補我的框架的問題。由於某種原因,右上框架從主框架中獲得了一些額外的空間,這打破了我的佈局,我怎樣才能防止這種情況發生?它確定如果label_frame擴展,但我不希望它從主框架獲得額外的空間。框架佈局使用Tkinter的

import sys 
import os 

import Tkinter as tk 
import ttk as ttk 

# 
# Right Window 
# 
class RightUpperWindow(tk.Frame): 
    def __init__(self, master=None): 
     self.parent = master 
     tk.Frame.__init__(self, self.parent, bg='bisque', borderwidth=0, relief="sunken") 
     self.__create_layout() 

    def __create_layout(self): 

     self.label_frame = tk.LabelFrame(self, text="I'm a Label frame", padx=0, pady=0, borderwidth=0, width = 1) 

     self.label1=tk.Label(self.label_frame, text="text1") 
     self.label2=tk.Label(self.label_frame, text="text2") 
     self.label3=tk.Label(self.label_frame, text="text3") 

     self.entry1 = tk.Entry(self.label_frame) 
     self.entry2 = tk.Entry(self.label_frame) 
     self.entry3 = tk.Entry(self.label_frame) 

     self.label_frame.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     self.label1.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.label2.grid(row=1, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.label3.grid(row=2, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     self.entry1.grid(row = 0, column = 1, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.entry2.grid(row = 1, column = 1, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.entry3.grid(row = 2, column = 1, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     self.label_frame.columnconfigure(0, weight=1) 
     self.label_frame.rowconfigure(0, weight=1) 

# 
# MainWindow 
# 
class MainWindow(tk.Frame): 
    def __init__(self, master=None): 
     self.parent = master 
     tk.Frame.__init__(self, self.parent, bg='bisque', borderwidth=1, relief="sunken") 
     self.__create_layout() 

    def __create_layout(self): 
     self.frame1 = tk.Frame(self, bg="grey") 
     self.frame2 = RightUpperWindow(self) #tk.Frame(self, bg="blue") 
     self.frame3 = tk.Frame(self, bg="green") 
     self.frame4 = tk.Frame(self, bg="brown") 
     self.frame5 = tk.Frame(self, bg="pink") 

     self.frame1.grid(row=0, column=0, rowspan=4, columnspan=8, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame2.grid(row=0, column=8, rowspan=4, columnspan=2, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame3.grid(row=4, column=0, rowspan=2, columnspan=5, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame4.grid(row=4, column=5, rowspan=2, columnspan=5, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame5.grid(row=5, column=0, rowspan=1, columnspan=10, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     for r in range(6): 
      self.rowconfigure(r, weight=1) 
     for c in range(10): 
      self.columnconfigure(c, weight=1) 

# 
# MAIN 
# 
def main(): 
    root = tk.Tk() 

    root.title("Frames") 
    root.geometry("550x300+525+300") 

    root.configure(background="#808080") 
    root.option_add("*font", ("Courier New", 9, "normal")) 

    window = MainWindow(master=root) 
    window.pack(side="top", fill="both", expand=True) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

enter image description here

計劃的佈局

enter image description here

+0

第二圖像是我計劃的佈局 – krusty

回答

1

唯一的問題是,你沒有給一個權重的行和列的標籤框架是。你給的權重小部件標籤框架,而不是權重RightUpperWindow

一下添加到RightUpperWindow.__create_layout

self.rowconfigure(0, weight=1) 
self.columnconfigure(0, weight=1) 

你在一個容器中使用grid每一次,你需要給至少一行和一列在該容器中的weight。這需要爲使用grid來管理子項的每個容器完成。

就個人而言,如果這是我的代碼,我會使用pack將labelframe放在UpperRightWindow之內,因爲它是該框架中唯一的窗口。與pack喲不必使用額外的行來爲行和列添加權重。在同一應用程序中混合使用gridpack沒有任何問題,只要您在不同的框架中使用它們即可。

上述修復的問題,即內labelframe沒有擴大,以填補給它的空間。你也有問題,裏面的錯誤小工具標籤框正在擴大。

您目前正在給labelframe,這不會給你所期望的輸出中的權重,以行和列0。由於您希望所有行的是一個統一的高度,給予該行以下最後一個小部件的重量,使其佔據了所有的額外空間。另外,您可能希望給第一列加權,因爲增大和縮小輸入字段而不是標籤更有意義。

更改此:

self.label_frame.columnconfigure(0, weight=1) 
    self.label_frame.rowconfigure(0, weight=1) 

...這樣的:

self.label_frame.columnconfigure(1, weight=1) 
    self.label_frame.rowconfigure(3, weight=1) 
+0

我爲你鼓掌,帽子掉了! – krusty

+0

也許我會按照你的建議使用包裝佈局。我已經將我的包佈局代碼添加到問題中,但爲什麼它不擴展條目? – krusty

+0

@krusty:在你已經得到答案後如此戲劇性地改變代碼會讓人感到困惑。我很想刪除我的答案,因爲它對修改後的代碼沒什麼意義。另外,你似乎誤解了我的評論。我不建議使用pack _inside_ labelframe,只是爲了labelframe本身。 –

-1

您似乎將所有的文/項標籤self.label_frame,這是擺在您的主要的行0列8幀。我假設你想爲這些標籤和條目使用分配給右上窗口的4行和2列?如果這種情況不需要使用label_frame。 嘗試這樣的事情,而不是:

# 
# Right Window 
# 
class RightUpperWindow(tk.Frame): 
    def __init__(self, master=None): 
     self.parent = master 
     tk.Frame.__init__(self, self.parent, bg='bisque', borderwidth=0, relief="sunken") 
     self.__create_layout() 

    def __create_layout(self): 

     # self.label_frame = tk.LabelFrame(self, text="I'm a Label frame", padx=0, pady=0, borderwidth=0, width = 1) 
     self.label0=tk.Label(self, text="header") 
     self.label1=tk.Label(self, text="text1") 
     self.label2=tk.Label(self, text="text2") 
     self.label3=tk.Label(self, text="text3") 

     self.entry1 = tk.Entry(self) 
     self.entry2 = tk.Entry(self) 
     self.entry3 = tk.Entry(self) 

     # self.label_frame.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.label0.grid(row=0, column=0, columnspan=2, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.label1.grid(row=1, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.label2.grid(row=2, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.label3.grid(row=3, column=0, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     self.entry1.grid(row = 1, column = 1, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.entry2.grid(row = 2, column = 1, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.entry3.grid(row = 3, column = 1, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     self.columnconfigure(0, weight=1) 
     self.rowconfigure(0, weight=1) 
+0

THX,但沒有這樣不是很好。我添加了一個圖像來顯示我要做的佈局。 – krusty