窗口顶部有一个框架,一个在底部

时间:2015-02-13 03:01:46

标签: python tkinter tk

我有两个文本框,我希望第一个位于窗口的顶部,另一个位于最底部。我正在使用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:根据布莱恩的建议,我又尝试了两件事:

使用隐形中间行:

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()

两者的行为仍与原始代码相同。

1 个答案:

答案 0 :(得分:1)

如果你想要一个在顶部,一个在底部,最简单的解决方案是使用pack,因为它旨在将小部件放在容器的边缘。例如:

frame1.pack(side="top", fill="x")
frame2.pack(side="bottom", fill="x")

如果你想使用网格,我会做的是将第一行放在第0行,将最后一行放在 2 行中,并将空行1配置为占用所有网格额外的空间:

frame1.grid(row=0, sticky="ew")
frame2.grid(row=2, sticky="ew")
root_frame.grid_rowconfigure(1, weight=1)

在任何一种情况下,您还必须确保将这些小部件放入 的框架正确打包/网格化。上面的代码可以工作,但你没有这样做,所以他们的父母也扩展到填满整个窗口。

由于您使用gridroot_frame置于根目录中,因此请确保其所在的行和列具有权重:

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)