class_docstr: Define a N by M grid layout
  
  Parameters
  ----------
  
  n_rows : int
      number of rows in the grid
  
  n_columns : int
      number of columns in the grid
  
  {style_params}
  
  Examples
  --------
  
  >>> from ipywidgets import GridspecLayout, Button, Layout
  >>> layout = GridspecLayout(n_rows=4, n_columns=2, height='200px')
  >>> layout[:3, 0] = Button(layout=Layout(height='auto', width='auto'))
  >>> layout[1:, 1] = Button(layout=Layout(height='auto', width='auto'))
  >>> layout[-1, 0] = Button(layout=Layout(height='auto', width='auto'))
  >>> layout[0, 1] = Button(layout=Layout(height='auto', width='auto'))
  >>> layout
code: def __init__(self, n_rows=None, n_columns=None, **kwargs):
      super().__init__(**kwargs)
      self.n_rows = n_rows
      self.n_columns = n_columns
      self._grid_template_areas = [
          ["."] * self.n_columns for i in range(self.n_rows)
      ]
  
      self._grid_template_rows = "repeat(%d, 1fr)" % (self.n_rows,)
      self._grid_template_columns = "repeat(%d, 1fr)" % (
          self.n_columns,
      )
      self._children = {}
      self._id_count = 0
  
imports: import re
  from collections import defaultdict
  from traitlets import Instance, Bool, Unicode, CUnicode, CaselessStrEnum, Tuple
  from traitlets import Integer
  from traitlets import HasTraits, TraitError
  from traitlets import observe, validate
  from .widget import Widget
  from .widget_box import GridBox
  from .docutils import doc_subst
label_desc: Use image node_id 1 to create a new GridspecLayout object from inherited base classes: GridBox, LayoutProperties with example: obj = GridspecLayout(n_rows, n_columns)