网格方法以正确定位框架

时间:2020-04-01 13:10:02

标签: tkinter

我正在尝试使用grid()方法放置两个框架-一个在窗口顶部,一个在窗口左侧。

我已经成功使用pack()方法做到了这一点-因此,这就是我想要的:

It looks fine with the pack method

这与pack()方法配合使用,效果很好:

import tkinter as tk

main_window = tk.Tk()
main_window.geometry("480x420")

frame_top = tk.Frame(main_window, bg="yellow", height=50)
frame_left = tk.Frame(main_window, bg="orange", width=50)

frame_top.pack(side=tk.TOP, fill=tk.X)
frame_left.pack(side=tk.LEFT, fill=tk.Y)


main_window.mainloop()

但是,我试图了解有关grid方法的更多信息,所以当我尝试使用grid()方法做同样的事情时,它最终看起来像这样:

does not look right when I use the grid method

我的带有grid()方法的代码(这里有些错误):

import tkinter as tk

main_window = tk.Tk()
main_window.geometry("480x420")

frame_top = tk.Frame(main_window, bg="yellow", height=50)
frame_left = tk.Frame(main_window, bg="orange", width=50)

frame_top.grid(row=0, column=0, sticky=tk.W+tk.N+tk.E)
frame_left.grid(row=1, column=0, sticky=tk.W+tk.S+tk.N)


main_window.mainloop()

grid方法有什么问题?如何使它最终看起来与使用pack()时的样子相同?

2 个答案:

答案 0 :(得分:1)

仅使用.grid()不能直接使用。 您需要设置rowspancolumnspan(如果您希望它始终填满一行或一列)。 并设置columnconfigurerowconfigure使其具有响应能力。这有点复杂。

import tkinter as tk

main_window = tk.Tk()
main_window.geometry("480x420")

frame_top = tk.Frame(main_window, bg="yellow", height=50)
frame_left = tk.Frame(main_window, bg="orange", width=50)

# always full one row
frame_top.grid(row=0, column=0, columnspan=999, sticky=tk.W+tk.N+tk.E)
# always full one column
frame_left.grid(row=1, column=0, rowspan=999, sticky=tk.W+tk.S+tk.N)

# make it responsive
main_window.grid_rowconfigure(0,weight=0)
main_window.grid_rowconfigure(1,weight=1)
main_window.grid_columnconfigure(0,weight=0)
main_window.grid_columnconfigure(1,weight=1)

main_window.mainloop()

现在是: enter image description here

答案 1 :(得分:1)

默认情况下,grid不会为窗口小部件分配任何额外的空间,除非被告知这样做。由于您的窗口小部件不是很宽,因此有很多未使用的额外空间。

您可以通过为行和列赋予“权重”来告诉网格如何处理多余的空间。权重告诉网格如何分配额外的空间。一条好的经验法则是,对于使用grid管理子项的小部件,应始终至少赋予一行和一列权重。

在您的特定情况下,添加以下代码将为您提供与使用pack的外观相同的外观:

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

这告诉grid,第1行应留有多余的垂直空间,第0列应留有额外的水平空间

但是,这只是一个简单的例子。我猜您将要在大空白中放置其他小部件。如果是这样,我认为将所有权重分配给第1行和第1列的更好的解决方案。然后,确保告知黄色框跨越两列。我还建议几乎始终使小部件在所有方面都“粘”起来。否则,您可能会得到不必要的空白。

frame_top.grid(row=0, column=0, sticky="nsew", columnspan=2)
frame_left.grid(row=1, column=0, sticky="nsew")

main_window.grid_rowconfigure(1, weight=1)
main_window.grid_columnconfigure(1, weight=1)

下一步是在第1行第1列中放置一个框架。然后,您可以将小部件添加到该框架中而不影响主布局-在框架内部,您可以使用pack或{{1} },该布局将独立于整个窗口中的布局。