code: def gen_stack_patches(
      patch_list,
      nr_row=None,
      nr_col=None,
      border=None,
      max_width=1000,
      max_height=1000,
      bgcolor=255,
      viz=False,
      lclick_cb=None,
  ):
      """
      Similar to :func:`stack_patches` but with a generator interface.
      It takes a much-longer list and yields stacked results one by one.
      For example, if ``patch_list`` contains 1000 images and ``nr_row==nr_col==10``,
      this generator yields 10 stacked images.
  
      Args:
          nr_row(int), nr_col(int): rows and cols of each result.
          max_width(int), max_height(int): Maximum allowed size of the
              stacked image. If ``nr_row/nr_col`` are None, this number
              will be used to infer the rows and cols. Otherwise the option is
              ignored.
          patch_list, border, viz, lclick_cb: same as in :func:`stack_patches`.
  
      Yields:
          np.ndarray: the stacked image.
      """
      # setup parameters
      patch_list = _preprocess_patch_list(patch_list)
      if lclick_cb is not None:
          viz = True
      ph, pw = patch_list.shape[1:3]
  
      if border is None:
          border = int(0.05 * min(ph, pw))
      if nr_row is None:
          nr_row = int(max_height / (ph + border))
      if nr_col is None:
          nr_col = int(max_width / (pw + border))
      canvas = Canvas(
          ph, pw, nr_row, nr_col, patch_list.shape[-1], border, bgcolor
      )
  
      nr_patch = nr_row * nr_col
      start = 0
  
      if lclick_cb is not None:
  
          def lclick_callback(img, x, y):
              idx = canvas.get_patchid_from_coord(x, y)
              idx = idx + start
              if idx < end:
                  lclick_cb(patch_list[idx], idx)
  
      else:
          lclick_callback = None
  
      while True:
          end = start + nr_patch
          cur_list = patch_list[start:end]
          if not len(cur_list):
              return
          canvas.draw_patches(cur_list)
          if viz:
              interactive_imshow(
                  canvas.canvas, lclick_cb=lclick_callback
              )
          yield canvas.canvas
          start = end
  
file_path: tensorpack/tensorpack/utils/viz.py
imports: import numpy
  import os
  import sys
  from ..utils.develop import create_dummy_func
  from .argtools import shape2d
  from .fs import mkdir_p
label_desc: Use image node_id 5 for calling a global function with example usage: gen_stack_patches(patch_list, nr_row, nr_col, border, max_width, max_height, bgcolor, viz, lclick_cb) without return types