我正在尝试使用Tkinter创建一个按钮网格(以实现可点击的单元格效果)。
我的主要问题是我无法使grid
和按钮自动调整并适合父窗口。
例如,当我在网格上有大量按钮时,而不是缩小按钮以使网格适合窗口内部,我得到一个离开屏幕的拉伸框架。
我正在寻找的效果是网格填充所有可用空间,然后调整其单元格以适应该空间。我已阅读文档,但我仍然无法弄清楚如何使其工作。
这是基本代码,这是我的出发点:
def __init__(self):
root = Tk()
frame = Frame(root)
frame.grid()
#some widgets get added in the first 6 rows of the frame's grid
#initialize grid
grid = Frame(frame)
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2)
#example values
for x in range(60):
for y in range(30):
btn = Button(grid)
btn.grid(column=x, row=y)
root.mainloop()
答案 0 :(得分:48)
您需要将行和列配置为具有非零权重,以便它们占用额外空间:
for x in range(60):
Grid.columnconfigure(grid, x, weight=1)
for y in range(30):
Grid.rowconfigure(grid, y, weight=1)
您还需要配置按钮,以便展开以填充单元格:
btn.grid(column=x, row=y, sticky=N+S+E+W)
这必须一直完成,所以这里有一个完整的例子:
from tkinter import *
root = Tk()
frame=Frame(root)
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(root, 0, weight=1)
frame.grid(row=0, column=0, sticky=N+S+E+W)
grid=Frame(frame)
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2)
Grid.rowconfigure(frame, 7, weight=1)
Grid.columnconfigure(frame, 0, weight=1)
#example values
for x in range(10):
for y in range(5):
btn = Button(frame)
btn.grid(column=x, row=y, sticky=N+S+E+W)
for x in range(10):
Grid.columnconfigure(frame, x, weight=1)
for y in range(5):
Grid.rowconfigure(frame, y, weight=1)
root.mainloop()
答案 1 :(得分:18)
@Vaughn Cato gave an excellent answer here。但是,他在他的例子中不小心包含了一堆无关的代码。这是一个清理完整且更有条理的完整示例,完全符合他的示例。
from tkinter import *
#Create & Configure root
root = Tk()
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(root, 0, weight=1)
#Create & Configure frame
frame=Frame(root)
frame.grid(row=0, column=0, sticky=N+S+E+W)
#Create a 5x10 (rows x columns) grid of buttons inside the frame
for row_index in range(5):
Grid.rowconfigure(frame, row_index, weight=1)
for col_index in range(10):
Grid.columnconfigure(frame, col_index, weight=1)
btn = Button(frame) #create a button inside frame
btn.grid(row=row_index, column=col_index, sticky=N+S+E+W)
root.mainloop()
截图:
首次打开时(小):
最大化窗口后:
答案 2 :(得分:3)
要在窗口最大化时使按钮展开,请尝试按如下方式修改button.grid条目:
btn.grid(column=x, row=y, sticky=N+S+E+W)
答案 3 :(得分:0)
使用滚动条(至少在Mac中是这样)时,网格权重方法可能不起作用,因此在使用滚动条时,将小部件和滚动条打包在框架中,然后将框架网格化。