如何在 tkinter 中创建一个自调整大小的按钮网格?

2022-01-18 00:00:00 python tkinter button grid autoresize

问题描述

我正在尝试使用 Tkinter 创建一个按钮网格(以实现可点击的单元格效果).

I am trying to create a grid of buttons(in order to achieve the clickable cell effect) with Tkinter.

我的主要问题是我无法使 grid 和按钮自动调整大小并适合父窗口.

My main problem is that I cannot make the grid and the buttons autoresize and fit the parent window.

例如,当我在网格上有大量按钮时,我没有缩小按钮以使网格适合窗口内部,而是得到一个超出屏幕的拉伸框架.

For example, when I have a high number of buttons on the grid, instead of shrinking the buttons so that the grid fits inside the window, I get a stretched frame that goes off screen.

我正在寻找的效果是网格填充所有可用空间,然后调整其单元格的大小以适应该空间.我已阅读文档,但我仍然无法弄清楚如何使其工作.

The effect that I am looking for is the grid filling all available space, then resizing its cells to fit within that space. I have read at the documentation, but I still cannot figure out how to make it work.

这是我的出发点的基本代码:

This is the basic code which is my starting point:

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


解决方案

您需要将行和列配置为具有非零权重,以便它们占用额外的空间:

You need to configure the rows and columns to have a non-zero weight so that they will take up the extra space:

grid.columnconfigure(tuple(range(60)), weight=1)
grid.rowconfigure(tuple(range(30)), weight=1)

您还需要配置按钮,以便它们展开以填充单元格:

You also need to configure your buttons so that they will expand to fill the cell:

btn.grid(column=x, row=y, sticky="news")

这必须一直进行,所以这里有一个完整的例子:

This has to be done all the way up, so here is a full example:

from tkinter import *

root = Tk()
frame = Frame(root)
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
frame.grid(row=0, column=0, sticky="news")
grid = Frame(frame)
grid.grid(sticky="news", column=0, row=7, columnspan=2)
frame.rowconfigure(7, weight=1)
frame.columnconfigure(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="news")

frame.columnconfigure(tuple(range(10)), weight=1)
frame.rowconfigure(tuple(range(5)), weight=1)

root.mainloop()

相关文章