Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fields with typing.Any causes ValueError #6

Open
yfukai opened this issue Aug 1, 2023 · 1 comment
Open

Fields with typing.Any causes ValueError #6

yfukai opened this issue Aug 1, 2023 · 1 comment
Assignees

Comments

@yfukai
Copy link
Contributor

yfukai commented Aug 1, 2023

The following happened when initializing napari plugin. Maybe we need to exclude fields with Any annotation.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)     
File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/napari/_qt/menus/plugins_menu.py:105, in PluginsMenu._add_plugin_actions.<locals>._add_toggle_widget(key=('napari-basicpy', 'BaSiC Shadow Correction'), hook_type='dock')                                                                     
    102     return                                                              
    104 if hook_type == 'dock':                                                 
--> 105     self._win.add_plugin_dock_widget(*key)                              
        key = ('napari-basicpy', 'BaSiC Shadow Correction')                     
        self._win = <napari._qt.qt_main_window.Window object at 0x19407c8b0>    
        self = <napari._qt.menus.plugins_menu.PluginsMenu object at 0x197353640>
    106 else:                                                                   
    107     self._win._add_plugin_function_widget(*key)

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/napari/_qt/qt_main_window.py:811, in Window.add_plugin_dock_widget(self=<napari._qt.qt_main_window.Window object>, plugin_name='napari-basicpy', widget_name='BaSiC Shadow Correction', tabify=False)
    808         wdg = wdg._magic_widget
    809     return dock_widget, wdg
--> 811 wdg = _instantiate_dock_widget(
        Widget = <class 'napari_basicpy._widget.BasicWidget'>
        self = <napari._qt.qt_main_window.Window object at 0x19407c8b0>
    812     Widget, cast('Viewer', self._qt_viewer.viewer)
    813 )
    815 # Add dock widget
    816 dock_kwargs.pop('name', None)

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/napari/_qt/qt_main_window.py:1465, in _instantiate_dock_widget(wdg_cls=<class 'napari_basicpy._widget.BasicWidget'>, viewer=Viewer(camera=Camera(center=(0.0, 0.0, 0.0), zoo...ouse_drag_gen={}, _mouse_wheel_gen={}, keymap={}))
   1460             break
   1461         # cannot look for param.kind == param.VAR_KEYWORD because
   1462         # QWidget allows **kwargs but errs on unknown keyword arguments
   1463 
   1464 # instantiate the widget
-> 1465 return wdg_cls(**kwargs)
        kwargs = {'viewer': Viewer(camera=Camera(center=(0.0, 0.0, 0.0), zoom=1.0, angles=(0.0, 0.0, 90.0), perspective=0.0, mouse_pan=True, mouse_zoom=True), cursor=Cursor(position=(1.0, 1.0), scaled=True, size=1, style=<CursorStyle.STANDARD: 'standard'>), dims=Dims(ndim=2, ndisplay=2, last_used=0, range=((0, 2, 1), (0, 2, 1)), current_step=(0, 0), order=(0, 1), axis_labels=('0', '1')), grid=GridCanvas(stride=1, shape=(-1, -1), enabled=False), layers=[], help='', status='', tooltip=Tooltip(visible=False, text=''), theme='dark', title='napari', mouse_over_canvas=False, mouse_move_callbacks=[], mouse_drag_callbacks=[], mouse_double_click_callbacks=[], mouse_wheel_callbacks=[<function dims_scroll at 0x18d9203a0>], _persisted_mouse_event={}, _mouse_drag_gen={}, _mouse_wheel_gen={}, keymap={})}
        wdg_cls = <class 'napari_basicpy._widget.BasicWidget'>

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/napari_basicpy/_widget.py:48, in BasicWidget.__init__(self=<napari_basicpy._widget.BasicWidget object>, viewer=Viewer(camera=Camera(center=(0.0, 0.0, 0.0), zoo...ouse_drag_gen={}, _mouse_wheel_gen={}, keymap={}))
     45 layer_select_container = QWidget()
     46 layer_select_container.setLayout(layer_select_layout)
---> 48 simple_settings, advanced_settings = self._build_settings_containers()
        self = <napari_basicpy._widget.BasicWidget object at 0x1973cc0d0>
     49 self.advanced_settings = advanced_settings
     51 self.run_btn = QPushButton("Run")

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/napari_basicpy/_widget.py:127, in BasicWidget._build_settings_containers(self=<napari_basicpy._widget.BasicWidget object>)
    120     return create_widget(
    121         value=default,
    122         annotation=type_,
    123         options={"tooltip": description},
    124     )
    126 # all settings here will be used to initialize BaSiC
--> 127 self._settings = {k: build_widget(k) for k in BaSiC().settings.keys()}
        self = <napari_basicpy._widget.BasicWidget object at 0x1973cc0d0>
        BaSiC = <class 'basicpy.basicpy.BaSiC'>
    129 self._extrasettings = dict()
    130 # settings to display correction profiles
    131 # options to show flatfield/darkfield profiles

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/napari_basicpy/_widget.py:127, in <dictcomp>(.0=<dict_keyiterator object>)
    120     return create_widget(
    121         value=default,
    122         annotation=type_,
    123         options={"tooltip": description},
    124     )
    126 # all settings here will be used to initialize BaSiC
--> 127 self._settings = {k: build_widget(k) for k in BaSiC().settings.keys()}
        k = 'resize_params'
        BaSiC = <class 'basicpy.basicpy.BaSiC'>
    129 self._extrasettings = dict()
    130 # settings to display correction profiles
    131 # options to show flatfield/darkfield profiles

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/napari_basicpy/_widget.py:120, in BasicWidget._build_settings_containers.<locals>.build_widget(k='resize_params')
    118     pass
    119 # name = field.name
--> 120 return create_widget(
        default = {}
        type_ = typing.Any
        description = 'Parameters for the resize function when downsampling images.'
        {"tooltip": description} = {'tooltip': 'Parameters for the resize function when downsampling images.'}
    121     value=default,
    122     annotation=type_,
    123     options={"tooltip": description},
    124 )

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/magicgui/widgets/bases/_create_widget.py:119, in create_widget(value={}, annotation=typing.Any, name='', param_kind='POSITIONAL_OR_KEYWORD', label=None, gui_only=False, app=None, widget_type=None, options={'tooltip': 'Parameters for the resize function when downsampling images.'}, is_result=False, raise_on_unknown=True)
    112 if (
    113     not _options.get("widget_type")
    114     and (name or "").lower() == "password"
    115     and annotation is str
    116 ):
    117     _options["widget_type"] = "Password"
--> 119 wdg_class, opts = get_widget_class(
        _options = {'tooltip': 'Parameters for the resize function when downsampling images.'}
        value = {}
        annotation = typing.Any
        is_result = False
        raise_on_unknown = True
    120     value, annotation, _options, is_result, raise_on_unknown
    121 )
    123 if issubclass(wdg_class, Widget):
    124     widget = wdg_class(**{**kwargs, **opts, **_options})

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/magicgui/type_map/_type_map.py:314, in get_widget_class(value={}, annotation=typing.Any, options={'tooltip': 'Parameters for the resize function when downsampling images.'}, is_result=False, raise_on_unknown=True)
    284 def get_widget_class(
    285     value: Any = Undefined,
    286     annotation: Any = Undefined,
   (...)
    289     raise_on_unknown: bool = True,
    290 ) -> tuple[WidgetClass, dict]:
    291     """Return a [magicgui.widgets.Widget][] subclass for the given `value`/`annotation`.
    292 
    293     Parameters
   (...)
    312         may be different than the options passed in.
    313     """
--> 314     widget_type, _options = _pick_widget_type(
        value = {}
        annotation = typing.Any
        options = {'tooltip': 'Parameters for the resize function when downsampling images.'}
        is_result = False
        raise_on_unknown = True
    315         value, annotation, options, is_result, raise_on_unknown
    316     )
    318     if isinstance(widget_type, str):
    319         widget_class = _import_wdg_class(widget_type)

File ~/.pyenv/versions/miniforge3-4.14.0-2/envs/napari-basicpy/lib/python3.10/site-packages/magicgui/type_map/_type_map.py:262, in _pick_widget_type(value={}, annotation=typing.Any, options={'nullable': False, 'tooltip': 'Parameters for the resize function when downsampling images.'}, is_result=False, raise_on_unknown=True)
    259     return _cls, {**options, **opts}
    261 if raise_on_unknown:
--> 262     raise ValueError(
        annotation = typing.Any
        _type = typing.Any
    263         f"No widget found for type {_type} and annotation {annotation!r}"
    264     )
    266 return widgets.EmptyWidget, {"visible": False}

ValueError: No widget found for type typing.Any and annotation typing.Any
@yfukai yfukai self-assigned this Aug 1, 2023
@yfukai
Copy link
Contributor Author

yfukai commented Aug 1, 2023

The problem was because of Callable annotation in the autosegment field.
Should be solved once peng-lab/BaSiCPy#130 is merged and released.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant