code: def _find_next_widget(self, direction, stay_in_col=False, start_at=None,
                            wrap=False):
          
          current_widget = self._live_widget
          current_col = self._live_col
          if start_at is not None:
              self._live_widget = start_at
          still_looking = True
          while still_looking:
              while 0 <= self._live_col < len(self._columns):
                  self._live_widget += direction
                  while 0 <= self._live_widget < len(
                          self._columns[self._live_col]):
                      widget = self._columns[self._live_col][self._live_widget]
                      if widget.is_tab_stop and not widget.disabled:
                          return
                      self._live_widget += direction
                  if stay_in_col:
                      # Don't move to another column - just stay where we are.
                      self._live_widget = current_widget
                      break
                  else:
                      self._live_col += direction
                      self._live_widget = -1 if direction > 0 else \
                          len(self._columns[self._live_col])
                      if self._live_col == current_col:
                          # We've wrapped all the way back to the same column -
                          # give up now and stay where we were.
                          self._live_widget = current_widget
                          return
  
              # If we got here we hit the end of the columns - only keep on
              # looking if we're allowed to wrap.
              still_looking = wrap
              if still_looking:
                  if self._live_col < 0:
                      self._live_col = len(self._columns) - 1
                  else:
                      self._live_col = 0
docs: Find the next widget to get the focus, stopping at the start/end of the list if hit.
  
          :param direction: The direction to move through the widgets.
          :param stay_in_col: Whether to limit search to current column.
          :param start_at: Optional starting point in current column.
          :param wrap: Whether to wrap around columns when at the end.