def get_widget_class( value: Any = None, annotation: type | None = None, options: WidgetOptions = {}) -> tuple[WidgetClass, WidgetOptions]: """Return a WidgetClass appropriate for the given parameters. Parameters ---------- value : Any, optional A python value. Will be used to determine the widget type if an ``annotation`` is not explicitly provided by default None annotation : Optional[Type], optional A type annotation, by default None options : WidgetOptions, optional Options to pass when constructing the widget, by default {} Returns ------- Tuple[WidgetClass, WidgetOptions] The WidgetClass, and WidgetOptions that can be used for params. WidgetOptions may be different than the options passed in. """ _options = cast(WidgetOptions, options) widget_type, _options = pick_widget_type(value, annotation, _options) if isinstance(widget_type, str): widget_class: WidgetClass = _import_class(widget_type) else: widget_class = widget_type if not _is_subclass(widget_class, widgets._bases.Widget): assert_protocol(widget_class, WidgetProtocol) return widget_class, _options
def __init__( self, widget_type: Type[_protocols.WidgetProtocol], name: str = "", annotation: Any = None, label: str = None, tooltip: Optional[str] = None, visible: Optional[bool] = None, enabled: bool = True, gui_only=False, backend_kwargs=dict(), **extra, ): # for ipywidgets API compatibility label = label or extra.pop("description", None) if extra: warnings.warn( f"\n\n{self.__class__.__name__}.__init__() got unexpected " f"keyword arguments {set(extra)!r}.\n" "In the future this will raise an exception\n", FutureWarning, ) _prot = self.__class__.__annotations__["_widget"] if not isinstance(_prot, str): _prot = _prot.__name__ prot = getattr(_protocols, _prot.replace("_protocols.", "")) _protocols.assert_protocol(widget_type, prot) self.__magicgui_app__ = use_app() assert self.__magicgui_app__.native self._widget = widget_type(**backend_kwargs) self.name: str = name self.param_kind = inspect.Parameter.POSITIONAL_OR_KEYWORD self._label = label self.tooltip = tooltip self.enabled = enabled self.annotation: Any = annotation self.gui_only = gui_only self.parent_changed = EventEmitter(source=self, type="parent_changed") self.label_changed = EventEmitter(source=self, type="label_changed") self._widget._mgui_bind_parent_change_callback(self._emit_parent) # put the magicgui widget on the native object...may cause error on some backend self.native._magic_widget = self self._post_init() self._visible: bool = False self._explicitly_hidden: bool = False if visible is not None: self.visible = visible