一帧在 window 顶部,一帧在底部
One frame at top of window, one at bottom
我有两个文本框,我希望第一个位于 window 的最顶部,另一个位于最底部。我正在使用 python 2.7,这是我尝试过的:
from Tkinter import *
import ttk
def main():
root = Tk()
root.title("Testing")
root_frame = ttk.Frame(root, padding="3 3 3 3")
root_frame.grid(column=0, row=0, sticky=(N, W, E, S))
root_frame.columnconfigure(0, weight=1)
root_frame.rowconfigure(0, weight=1)
frame1 = ttk.Frame(root_frame, padding="3 3 3 3")
frame1.grid(column=0, row=0, sticky=(N, W, E))
frame1.rowconfigure(1, weight=1)
frame1.columnconfigure(0, weight=1)
frame2 = ttk.Frame(root_frame, padding="3 3 3 3")
frame2.grid(column=0, row=1, sticky=(W, E, S))
ttk.Label(frame1, text="This is frame 1").grid(column=0, row=0, sticky=(W, E))
ttk.Label(frame2, text="This is frame 2").grid(column=0, row=0, sticky=(W, E))
root.mainloop()
if __name__ == "__main__":
main()
它只是将第二个文本框直接放在第一个文本框的下面。我做错了什么?
谢谢
e:根据 Bryan 的建议,我又尝试了两件事:
使用不可见的中间行:
from Tkinter import *
import ttk
def main():
root = Tk()
root.title("Testing")
root_frame = ttk.Frame(root, padding="3 3 3 3")
root_frame.grid(column=0, row=0, sticky=(N, W, E, S))
root_frame.grid_rowconfigure(1, weight=1)
frame1 = ttk.Frame(root_frame, padding="3 3 3 3")
frame1.grid(column=0, row=0, sticky=(N, W, E))
frame2 = ttk.Frame(root_frame, padding="3 3 3 3")
frame2.grid(column=0, row=2, sticky=(W, E, S))
ttk.Label(frame1, text="This is frame 1").grid(column=0, row=0, sticky=(W, E))
ttk.Label(frame2, text="This is frame 2").grid(column=0, row=0, sticky=(W, E))
root.mainloop()
if __name__ == "__main__":
main()
打包而不是网格:
from Tkinter import *
import ttk
def main():
root = Tk()
root.title("Testing")
root_frame = ttk.Frame(root, padding="3 3 3 3")
root_frame.grid(column=0, row=0, sticky=(N, W, E, S))
frame1 = ttk.Frame(root_frame, padding="3 3 3 3")
frame1.pack(side="top", fill="x")
frame2 = ttk.Frame(root_frame, padding="3 3 3 3")
frame2.pack(side="bottom", fill="x")
ttk.Label(frame1, text="This is frame 1").grid(column=0, row=0, sticky=(W, E))
ttk.Label(frame2, text="This is frame 2").grid(column=0, row=0, sticky=(W, E))
root.mainloop()
if __name__ == "__main__":
main()
两者的行为仍然与我的原始代码相同。
如果您想要一个在顶部,一个在底部,最简单的解决方案是使用 pack
,因为它旨在将小部件放置在容器的边缘。例如:
frame1.pack(side="top", fill="x")
frame2.pack(side="bottom", fill="x")
如果你想使用网格,我会做的是将顶部的放在第 0 行,底部的放在第 2 行,并有一个空的第 1 行配置占用所有多余的 space:
frame1.grid(row=0, sticky="ew")
frame2.grid(row=2, sticky="ew")
root_frame.grid_rowconfigure(1, weight=1)
在任何一种情况下,您还必须确保将这些小部件放入 和 的框架是正确的 packed/gridded。上面的代码有效,但你没有做到,所以他们的父级也会扩展以填充整个 window。
由于您使用 grid
将 root_frame
放在根目录中,请确保它所在的行和列被赋予权重:
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
我有两个文本框,我希望第一个位于 window 的最顶部,另一个位于最底部。我正在使用 python 2.7,这是我尝试过的:
from Tkinter import *
import ttk
def main():
root = Tk()
root.title("Testing")
root_frame = ttk.Frame(root, padding="3 3 3 3")
root_frame.grid(column=0, row=0, sticky=(N, W, E, S))
root_frame.columnconfigure(0, weight=1)
root_frame.rowconfigure(0, weight=1)
frame1 = ttk.Frame(root_frame, padding="3 3 3 3")
frame1.grid(column=0, row=0, sticky=(N, W, E))
frame1.rowconfigure(1, weight=1)
frame1.columnconfigure(0, weight=1)
frame2 = ttk.Frame(root_frame, padding="3 3 3 3")
frame2.grid(column=0, row=1, sticky=(W, E, S))
ttk.Label(frame1, text="This is frame 1").grid(column=0, row=0, sticky=(W, E))
ttk.Label(frame2, text="This is frame 2").grid(column=0, row=0, sticky=(W, E))
root.mainloop()
if __name__ == "__main__":
main()
它只是将第二个文本框直接放在第一个文本框的下面。我做错了什么?
谢谢
e:根据 Bryan 的建议,我又尝试了两件事:
使用不可见的中间行:
from Tkinter import *
import ttk
def main():
root = Tk()
root.title("Testing")
root_frame = ttk.Frame(root, padding="3 3 3 3")
root_frame.grid(column=0, row=0, sticky=(N, W, E, S))
root_frame.grid_rowconfigure(1, weight=1)
frame1 = ttk.Frame(root_frame, padding="3 3 3 3")
frame1.grid(column=0, row=0, sticky=(N, W, E))
frame2 = ttk.Frame(root_frame, padding="3 3 3 3")
frame2.grid(column=0, row=2, sticky=(W, E, S))
ttk.Label(frame1, text="This is frame 1").grid(column=0, row=0, sticky=(W, E))
ttk.Label(frame2, text="This is frame 2").grid(column=0, row=0, sticky=(W, E))
root.mainloop()
if __name__ == "__main__":
main()
打包而不是网格:
from Tkinter import *
import ttk
def main():
root = Tk()
root.title("Testing")
root_frame = ttk.Frame(root, padding="3 3 3 3")
root_frame.grid(column=0, row=0, sticky=(N, W, E, S))
frame1 = ttk.Frame(root_frame, padding="3 3 3 3")
frame1.pack(side="top", fill="x")
frame2 = ttk.Frame(root_frame, padding="3 3 3 3")
frame2.pack(side="bottom", fill="x")
ttk.Label(frame1, text="This is frame 1").grid(column=0, row=0, sticky=(W, E))
ttk.Label(frame2, text="This is frame 2").grid(column=0, row=0, sticky=(W, E))
root.mainloop()
if __name__ == "__main__":
main()
两者的行为仍然与我的原始代码相同。
如果您想要一个在顶部,一个在底部,最简单的解决方案是使用 pack
,因为它旨在将小部件放置在容器的边缘。例如:
frame1.pack(side="top", fill="x")
frame2.pack(side="bottom", fill="x")
如果你想使用网格,我会做的是将顶部的放在第 0 行,底部的放在第 2 行,并有一个空的第 1 行配置占用所有多余的 space:
frame1.grid(row=0, sticky="ew")
frame2.grid(row=2, sticky="ew")
root_frame.grid_rowconfigure(1, weight=1)
在任何一种情况下,您还必须确保将这些小部件放入 和 的框架是正确的 packed/gridded。上面的代码有效,但你没有做到,所以他们的父级也会扩展以填充整个 window。
由于您使用 grid
将 root_frame
放在根目录中,请确保它所在的行和列被赋予权重:
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)