code: def _calc_scrollbars(self, viewer, whence):
          
          if self._scrolling or whence > 0:
              return
  
          # flag that suppresses a cyclical callback
          self._adjusting = True
          try:
              bd = self.viewer.get_bindings()
              res = bd.calc_pan_pct(self.viewer, pad=self.pad)
              if res is None:
                  return
  
              hsb = self.horizontalScrollBar()
              vsb = self.verticalScrollBar()
  
              page_h, page_v = (int(round(res.thm_pct_x * self.range_h)),
                                int(round(res.thm_pct_y * self.range_v)))
              hsb.setPageStep(page_h)
              vsb.setPageStep(page_v)
  
              upper_h = max(1, self.range_h - page_h)
              upper_v = max(1, self.range_v - page_v)
              hsb.setRange(0, upper_h)
              vsb.setRange(0, upper_v)
              self.upper_h, self.upper_v = upper_h, upper_v
  
              val_h, val_v = (int(round(res.pan_pct_x * self.upper_h)),
                              int(round((1.0 - res.pan_pct_y) * self.upper_v)))
              hsb.setValue(val_h)
              vsb.setValue(val_v)
  
          finally:
              self._adjusting = False
docs: Calculate and set the scrollbar handles from the pan and
          zoom positions.