¿Cómo crear una cuadrícula autoajustable de botones en tkinter?

Estoy intentando crear una cuadrícula de botones (para lograr el efecto de la celda pulsable) con Tkinter.

Mi problema principal es que no puedo hacer que la grid y los botones se ajusten automáticamente a la ventana principal.

Por ejemplo, cuando tengo una gran cantidad de botones en la cuadrícula, en lugar de reducir los botones para que la cuadrícula encaje dentro de la ventana, obtengo un marco estirado que se apaga.

El efecto que estoy buscando es que la cuadrícula ocupe todo el espacio disponible y luego redimensione sus celdas para que quepan dentro de ese espacio. He leído en la documentación, pero todavía no puedo averiguar cómo hacer que funcione.

Este es el código básico que es mi punto de partida:

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

Debe configurar las filas y columnas para que tengan un peso distinto de cero para que ocupen el espacio adicional:

 for x in range(60): Grid.columnconfigure(grid, x, weight=1) for y in range(30): Grid.rowconfigure(grid, y, weight=1) 

También necesita configurar sus botones para que se expandan para llenar la celda :

 btn.grid(column=x, row=y, sticky=N+S+E+W) 

Esto se debe hacer hasta el final, así que aquí hay un ejemplo completo:

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

@Vaughn Cato dio una excelente respuesta aquí . Sin embargo, accidentalmente ha incluido un montón de código extraño en su ejemplo. Aquí hay un ejemplo completo más limpio y más organizado haciendo exactamente lo que hace su ejemplo.

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

Capturas de pantalla:

Cuando se abre por primera vez (pequeño):

introduzca la descripción de la imagen aquí

Después de maximizar la ventana:

introduzca la descripción de la imagen aquí

Para hacer que los botones se expandan cuando la ventana está maximizada, intente modificar la entrada button.grid de la siguiente manera:

 btn.grid(column=x, row=y, sticky=N+S+E+W)