code: def _morph_rgb(self, rgb1, rgb2, step=1):
          
          pos1, pos2 = list(rgb1), list(rgb2)
          indexes = [i for i, _ in enumerate(pos1)]
  
          def step_value(a, b):
              """ Returns the amount to add to `a` to make it closer to `b`,
                  multiplied by `step`.
              """
              if a < b:
                  return step
              if a > b:
                  return -step
              return 0
  
          steps = [step_value(pos1[x], pos2[x]) for x in indexes]
          stepcnt = 0
          while (pos1 != pos2):
              stepcnt += 1
              stop = yield tuple(pos1)
              if stop:
                  break
              for x in indexes:
                  if pos1[x] != pos2[x]:
                      pos1[x] += steps[x]
                      if (steps[x] < 0) and (pos1[x] < pos2[x]):
                          # Over stepped, negative.
                          pos1[x] = pos2[x]
                      if (steps[x] > 0) and (pos1[x] > pos2[x]):
                          # Over stepped, positive.
                          pos1[x] = pos2[x]
          yield tuple(pos1)
docs: Morph an rgb value into another, yielding each step along the way.