code: def grid_widgets(self):
          
          # Categories
          for index, label in enumerate(self._category_labels.values()):
              label.grid(column=0, row=index, padx=5, sticky="nw", pady=(1, 0) if index == 0 else 0)
          # Canvas widgets
          self._canvas_scroll.grid(column=1, row=0, padx=(0, 5), pady=5, sticky="nswe")
          self._canvas_ticks.grid(column=1, row=1, padx=(0, 5), pady=(0, 5), sticky="nswe")
          self._scrollbar_timeline.grid(column=1, row=2, padx=(0, 5), pady=(0, 5), sticky="we")
          # Zoom widgets
          self._button_zoom_in.grid(row=0, column=0, pady=5, sticky="nswe")
          self._button_zoom_out.grid(row=1, column=0, pady=(0, 5), sticky="nswe")
          self._button_zoom_reset.grid(row=2, column=0, pady=(0, 5), sticky="nswe")
          # Frames
          self._canvas_categories.grid(column=0, row=0, padx=5, pady=5, sticky="nswe")
          self._scrollbar_vertical.grid(column=2, row=0, pady=5, padx=(0, 5), sticky="ns")
          self._frame_zoom.grid(column=3, row=0, rowspan=2, padx=(0, 5), pady=5, sticky="nswe")
docs: Configure all widgets using the grid geometry manager
  
          Automatically called by the :meth:`__init__` method.
          Does not have to be called by the user except in extraordinary
          cases.