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 __setitem__(self, key, value):
      row, column = key
      self._id_count += 1
      obj_id = "widget%03d" % self._id_count
      value.layout.grid_area = obj_id
  
      rows, columns = self._get_indices_from_slice(row, column)
  
      for row in rows:
          for column in columns:
              current_value = self._grid_template_areas[row][column]
              if (
                  current_value != "."
                  and current_value in self._children
              ):
                  del self._children[current_value]
              self._grid_template_areas[row][column] = obj_id
  
      self._children[obj_id] = value
      self._update_layout()
  
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 4 for calling the GridspecLayout obj's underlying member method code with example usage: obj.__setitem__(key, value) without return types