我正在尝试使用grid()方法放置两个框架-一个在窗口顶部,一个在窗口左侧。
我已经成功使用pack()方法做到了这一点-因此,这就是我想要的:
这与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()方法做同样的事情时,它最终看起来像这样:
我的带有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()时的样子相同?
答案 0 :(得分:1)
仅使用.grid()
不能直接使用。
您需要设置rowspan
和columnspan
(如果您希望它始终填满一行或一列)。
并设置columnconfigure
和rowconfigure
使其具有响应能力。这有点复杂。
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()
答案 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} },该布局将独立于整个窗口中的布局。