code: def set(self, value):
          
          if self.readonly:
              raise ValueError("Option is read-only.")
          val_p = None
          if self.type == 'selection':
              if value not in self.choices:
                  raise ValueError("Invalid choice (valid: {0})".format(
                                   repr(self.choices)))
              val_p = ffi.new("const char[]", value.encode())
          elif self.type == 'text':
              if not isinstance(value, basestring):
                  raise ValueError("Value must be a string.")
              val_p = ffi.new("char**")
              val_p[0] = ffi.new("char[]", value.encode())
          elif self.type == 'range':
              if value < self.range.min or value > self.range.max:
                  raise ValueError("Value exceeds valid range ({0}-{1}."
                                   .format(self.range.min, self.range.max))
              if value % self.range.step:
                  raise ValueError("Value can only be changed in steps of {0}."
                                   .format(self.range.step))
              val_p = ffi.new("float*")
              val_p[0] = value
          elif self.type == 'toggle':
              if not isinstance(value, bool):
                  raise ValueError("Value must be bool.")
              val_p = ffi.new("int*")
              val_p[0] = int(value)
          elif self.type == 'date':
              val_p = ffi.new("int*")
              val_p[0] = value
          lib.gp_widget_set_value(self._widget, val_p)
          lib.gp_camera_set_config(self._cam._cam, self._root, self._cam._ctx)
          self.value = value
docs: Update value of the option.
  
          Only possible for options with :py:attr:`readonly` set to `False`.
          If :py:attr:`type` is `choice`, the value must be one of the
          :py:attr:`choices`.
          If :py:attr:`type` is `range`, the value must be in the range
          described by :py:attr:`range`.
  
          :param value:   Value to set