2015-11-06 180 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