我正在玩tkinter框架布局。我从Bryan yestarday那里得到了一个很好的回复,不幸的是我遇到填充框架的问题。由于某种原因,右上方框架从主框架获得了一些额外的空间,这打破了我的布局,我该如何防止这种情况发生?如果label_frame扩展但是我不希望它从主框架中获得额外的空间,那就OK了。
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()
计划布局
答案 0 :(得分:1)
唯一的问题是,您没有给行标记框在中的行赋予权重。您已为标签框中的小部件赋予权重,但未对RightUpperWindow
赋予权重。
将此添加到RightUpperWindow.__create_layout
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
每次在容器中使用grid
时,您需要在该容器中至少给出一行和一列weight
。需要对使用grid
来管理其子项的每个容器执行此操作。
就个人而言,如果这是我的代码,我会使用pack
将labelframe放在UpperRightWindow
内,因为它是该框架中唯一的窗口。使用pack
,您不必使用额外的行来为行和列添加权重。将grid
和pack
混合在同一个应用程序中没有错,只要您在不同的框架中使用它们即可。
以上解决了内部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)
答案 1 :(得分:-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)