code: def save(self, validate):
          
          invalid = []
          for column in self._columns:
              for widget in column:
                  if widget.is_valid or not validate:
                      if widget.name is not None:
                          # This relies on the fact that we are passed the actual
                          # dict and so can edit it directly.  In this case, that
                          # is all we want - no need to update the widgets.
                          self._frame._data[widget.name] = widget.value
                  else:
                      invalid.append(widget.name)
          if len(invalid) > 0:
              raise InvalidFields(invalid)
docs: Save the current values in all the widgets back to the persistent data storage.
  
          :param validate: whether to validate the saved data or not.
          :raises: InvalidFields if any invalid data is found.