Skip to content

Unable to launch plugin on Napari #242

@kandil21

Description

@kandil21

Hello,

Thank you very much for creating this tool! I had been using it on Mac with no issues but have recently switched to a Windows laptop and running into the following issue. Would greatly appreciate any help with it.

When I click on the plugin on Napari, I get "Key error: 'fa'".

Thank you in advance for your help!

Software: Windows 11
napari version 0.6.5
Python 3.11.13

Here is what the traceback says:

KeyError Traceback (most recent call last)
File ~\anaconda3\envs\ultrack\Lib\site-packages\app_model\backends\qt_qaction.py:59, in QCommandAction._on_triggered(self=QMenuItemAction(MenuItem(when=None, group='3_plu...='Ultrack (ultrack)'))), alt=None), app='napari'), checked=True)
55 def _on_triggered(self, checked: bool) -> None:
56 # execute_command returns a Future, for the sake of eventually being
57 # asynchronous without breaking the API. For now, we call result()
58 # to raise any exceptions.
---> 59 self._app.commands.execute_command(self._command_id).result()
self._command_id = 'ultrack:Ultrack'
self = QMenuItemAction(MenuItem(when=None, group='3_plugin_contributions', order=None, command=CommandRule(id='ultrack:Ultrack', title='Ultrack (ultrack)', category=None, tooltip=None, status_tip=None, icon=None, icon_visible_in_menu=True, enablement=None, short_title=None, toggled=ToggleRule(condition=None, get_current=functools.partial(<function _get_current_dock_status at 0x000001DA44EFCA40>, full_name='Ultrack (ultrack)'))), alt=None), app='napari')
self._app = Application('napari')
File ~\anaconda3\envs\ultrack\Lib\site-packages\app_model\registries_commands_reg.py:247, in CommandsRegistry.execute_command(self=<CommandsRegistry at 0x1da4353a250 (158 commands)>, id='ultrack:Ultrack', execute_asynchronously=False, *args=(), **kwargs={})
243 except Exception as e:
244 if self._raise_synchronous_exceptions:
245 # note, the caller of this function can also achieve this by
246 # calling future.result() on the returned future object.
--> 247 raise e
248 future.set_exception(e)
250 return future

File ~\anaconda3\envs\ultrack\Lib\site-packages\app_model\registries_commands_reg.py:242, in CommandsRegistry.execute_command(self=<CommandsRegistry at 0x1da4353a250 (158 commands)>, id='ultrack:Ultrack', execute_asynchronously=False, *args=(), **kwargs={})
240 future: Future = Future()
241 try:
--> 242 future.set_result(cmd(*args, **kwargs))
future = <Future at 0x1da51794310 state=pending>
cmd = <function Store.inject.._inner.._exec at 0x000001DA517868E0>
args = ()
kwargs = {} 243 except Exception as e:
244 if self._raise_synchronous_exceptions:
245 # note, the caller of this function can also achieve this by
246 # calling future.result() on the returned future object.

File ~\anaconda3\envs\ultrack\Lib\site-packages\in_n_out_store.py:934, in Store.inject_processors.._deco.._exec(*args=(), **kwargs={})
932 @wraps(func)
933 def _exec(*args: P.args, **kwargs: P.kwargs) -> R:
--> 934 result = func(*args, **kwargs)
func = <function Store.inject.._inner.._exec at 0x000001DA51786980>
args = ()
kwargs = {} 935 if result is not None:
936 self.process(
937 result,
938 type_hint=type_hint,
(...) 941 _funcname=getattr(func, "qualname", str(func)),
942 )

File ~\anaconda3\envs\ultrack\Lib\site-packages\in_n_out_store.py:804, in Store.inject.._inner.._exec(*args=(), **kwargs={})
797 logger.debug(
798 " Calling %s with %r (injected %r)",
799 _fname,
800 bound.arguments,
801 _injected_names,
802 )
803 try:
--> 804 result = func(**bound.arguments)
bound = <BoundArguments (plugin='ultrack', widget_name='Ultrack', full_name='Ultrack (ultrack)')>
func = functools.partial(<function _toggle_or_get_widget at 0x000001DA44EFC9A0>, plugin='ultrack', widget_name='Ultrack', full_name='Ultrack (ultrack)')
bound.arguments = {'plugin': 'ultrack', 'widget_name': 'Ultrack', 'full_name': 'Ultrack (ultrack)'} 805 except TypeError as e:
806 if "missing" not in e.args[0]:

File ~\anaconda3\envs\ultrack\Lib\site-packages\napari_qt_qplugins_qnpe2.py:352, in _toggle_or_get_widget(plugin='ultrack', widget_name='Ultrack', full_name='Ultrack (ultrack)')
350 if widget_param:
351 kwargs[widget_param] = viewer
--> 352 return widget_callable(**kwargs), full_name
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, orientation=(<DepthAxisOrientation.TOWARDS: 'towards'>, <VerticalAxisOrientation.DOWN: 'down'>, <HorizontalAxisOrientation.RIGHT: 'right'>)), cursor=Cursor(position=(1.0, 1.0), viewbox=None, scaled=True, style=<CursorStyle.STANDARD: 'standard'>, size=1.0), dims=Dims(ndim=2, ndisplay=2, order=(0, 1), axis_labels=('0', '1'), rollable=(True, True), range=(RangeTuple(start=0.0, stop=2.0, step=1.0), RangeTuple(start=0.0, stop=2.0, step=1.0)), margin_left=(0.0, 0.0), margin_right=(0.0, 0.0), point=(np.float64(0.0), np.float64(0.0)), last_used=0), grid=GridCanvas(stride=1, shape=(-1, -1), enabled=False, spacing=0.0), layers=[], help='', status='Ready', tooltip=Tooltip(visible=False, text=''), theme='dark', title='napari', mouse_over_canvas=True, mouse_move_callbacks=[], mouse_drag_callbacks=[<function drag_to_zoom at 0x000001DA43718360>], mouse_double_click_callbacks=[<function double_click_to_zoom at 0x000001DA437182C0>], mouse_wheel_callbacks=[<function dims_scroll at 0x000001DA43718220>], _persisted_mouse_event={}, _mouse_drag_gen={}, _mouse_wheel_gen={}, _keymap={})}
widget_callable = <class 'ultrack.widgets.ultrackwidget.ultrackwidget.UltrackWidget'>
full_name = 'Ultrack (ultrack)'
File ~\anaconda3\envs\ultrack\Lib\site-packages\ultrack\widgets\ultrackwidget\ultrackwidget.py:88, in UltrackWidget.init(self=<ultrack.widgets.ultrackwidget.ultrackwidget.UltrackWidget object>, viewer=Viewer(camera=Camera(center=(0.0, 0.0, 0.0), zoo...use_drag_gen={}, _mouse_wheel_gen={}, _keymap={}))
86 self.workflow = UltrackWorkflow(viewer)
87 self._cb_images = {}
---> 88 self._data_forms = DataForms(self._on_change_config)
self = <ultrack.widgets.ultrackwidget.ultrackwidget.UltrackWidget object at 0x000001DA658A1BD0> 90 self._config_valid = True
91 self._all_images_are_valid = False

File ~\anaconda3\envs\ultrack\Lib\site-packages\ultrack\widgets\ultrackwidget\data_forms.py:85, in DataForms.init(self=<ultrack.widgets.ultrackwidget.data_forms.DataForms object>, on_change_any_input=>)
83 self._additional_bindings = []
84 self._additional_forms = {}
---> 85 self._setup_forms()
self = <ultrack.widgets.ultrackwidget.data_forms.DataForms object at 0x000001DA51795190> 86 self.load_config(MainConfig())

File ~\anaconda3\envs\ultrack\Lib\site-packages\ultrack\widgets\ultrackwidget\data_forms.py:103, in DataForms._setup_forms(self=<ultrack.widgets.ultrackwidget.data_forms.DataForms object>)
97 additional_options = json.load(opts)
98 forms_metadata["additional_options"] = {
99 "title": "Pre-processing",
100 "fields": additional_options,
101 }
--> 103 self._create_form("additional_options", forms_metadata["additional_options"])
forms_metadata = {'segmentation': {'title': 'Segmentation', 'fields': {'threshold': {'label': 'Threshold', 'type': 'number', 'step': 'any', 'required': True, 'tooltip': 'Threshold value for the segmentation algorithm', 'validationMessage': 'Please enter a valid threshold value (number)'}, 'min_area': {'label': 'Min Area', 'type': 'number', 'min': 0, 'required': True, 'tooltip': 'Minimum area for detected objects', 'validationMessage': 'Please enter a valid minimum area value (number)'}, 'max_area': {'label': 'Max Area', 'type': 'number', 'min': 1, 'required': True, 'tooltip': 'Maximum area for detected objects', 'validationMessage': 'Please enter a valid maximum area value (number)'}, 'min_frontier': {'label': 'Min Frontier', 'type': 'number', 'step': 'any', 'required': True, 'tooltip': 'Minimum frontier for detected objects', 'validationMessage': 'Please enter a valid minimum frontier value (number)'}, 'n_workers': {'label': 'Number of Workers', 'type': 'number', 'min': 1, 'required': True, 'tooltip': 'Number of workers to use for segmentation', 'validationMessage': 'Please enter a valid number of workers (> 1)'}}}, 'linking': {'title': 'Linking', 'fields': {'max_distance': {'label': 'Max Distance', 'type': 'number', 'step': 'any', 'min': 0.0, 'required': True, 'tooltip': 'Maximum distance for linking segments', 'validationMessage': 'Please enter a valid maximum distance value (number)'}, 'distance_weight': {'label': 'Distance Weight', 'type': 'number', 'step': 'any', 'min': 0.0, 'required': True, 'tooltip': 'Distance weight for linking', 'validationMessage': 'Please enter a valid distance weight value (number)'}, 'max_neighbors': {'label': 'Max Neighbors', 'type': 'number', 'min': 1, 'required': True, 'tooltip': 'Maximum number of neighbors', 'validationMessage': 'Please enter a valid maximum number of neighbors (> 1)'}, 'n_workers': {'label': 'Number of Workers', 'type': 'number', 'min': 1, 'required': True, 'tooltip': 'Number of workers to use for linking', 'validationMessage': 'Please enter a valid number of workers (> 1)'}}}, 'tracking': {'title': 'Tracking', 'fields': {'appear_weight': {'label': 'Appear Weight', 'type': 'number', 'max': 0.0, 'step': 'any', 'required': True, 'tooltip': 'Appear weight for tracking', 'validationMessage': 'Please enter a valid appear weight value (negative number)'}, 'disappear_weight': {'label': 'Disappear Weight', 'type': 'number', 'max': 0.0, 'step': 'any', 'required': True, 'tooltip': 'Disappear weight for tracking', 'validationMessage': 'Please enter a valid disappear weight value (negative number)'}, 'division_weight': {'label': 'Division Weight', 'type': 'number', 'max': 0.0, 'step': 'any', 'required': True, 'tooltip': 'Division weight for tracking', 'validationMessage': 'Please enter a valid division weight value (negative number)'}, 'window_size': {'label': 'Window Size', 'type': 'number', 'min': 0, 'default': '', 'tooltip': 'Window size for tracking. Blank for the whole movie.', 'validationMessage': 'Please enter a valid window size value (number or 0 for blank)'}, 'overlap_size': {'label': 'Overlap Size', 'type': 'number', 'min': 1, 'required': True, 'tooltip': 'Overlap size for tracking', 'validationMessage': 'Please enter a valid overlap size value (number)'}, 'solution_gap': {'label': 'Solution Gap', 'type': 'number', 'step': 'any', 'required': True, 'tooltip': 'Solution gap for tracking', 'validationMessage': 'Please enter a valid solution gap value (number)'}, 'n_threads': {'label': 'Number of Threads', 'type': 'number', 'min': -1, 'required': True, 'tooltip': 'Number of Threads to use for tracking. -1 for all available threads.', 'validationMessage': 'Please enter a valid number of threads'}}}, 'additional_options': {'title': 'Pre-processing', 'fields': {'label_to_contours_kwargs': {'subform': True, 'title': 'Label to Contours', 'fields': {'sigma': {'label': 'Sigma', 'type': 'number', 'min': 0.0, 'step': 'any', 'tooltip': "Contours smoothing parameter (gaussian blur), contours aren't smoothed if not provided", 'validationMessage': 'Please enter a valid sigma value (number or blank)'}}}, 'detect_foreground_kwargs': {'subform': True, 'title': 'Detect Foreground', 'fields': {'sigma': {'label': 'Sigma', 'type': 'number', 'default': 15.0, 'min': 0.0, 'step': 'any', 'required': True, 'tooltip': 'Sigma used to estimate background, napari layer scale is used to convert Sigma to physical space.', 'validationMessage': 'Please enter a valid sigma value (number)'}, 'remove_hist_mode': {'label': 'Remove Histogram Mode', 'type': 'checkbox', 'default': False, 'required': False, 'tooltip': 'Removes histogram mode before computing otsu threshold, useful when background regions are being detected', 'validationMessage': 'Please enter a valid remove histogram mode value (boolean)'}, 'min_foreground': {'label': 'Min Foreground', 'type': 'number', 'min': 0.0, 'step': 'any', 'default': 0.0, 'required': True, 'tooltip': 'Minimum value of foreground pixels after background subtraction and smoothing', 'validationMessage': 'Please enter a valid min foreground value (number)'}, 'channel_axis': {'label': 'Channel Axis', 'type': 'number', 'min': 0, 'max': 4, 'required': False, 'default': '', 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T, C, Y, X) would have channel_axis=0. When provided it will be used to compute the foreground mask for each channel separately and merge them', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}}}, 'robust_invert_kwargs': {'subform': True, 'title': 'Robust Invert', 'fields': {'sigma': {'label': 'Sigma', 'type': 'number', 'min': 0.0, 'default': 1.0, 'required': True, 'step': 'any', 'tooltip': 'Sigma used to smooth the image, napari layer scale is used to convert Sigma to physical space.', 'validationMessage': 'Please enter a valid sigma value (number)'}, 'lower_quantile': {'label': 'Lower Quantile', 'type': 'number', 'max': 1.0, 'min': 0.0, 'default': '', 'step': 'any', 'required': False, 'tooltip': 'Lower quantile used to clip the intensities, minimum used when blank', 'validationMessage': 'Please enter a valid lower quantile value (number or blank)'}, 'upper_quantile': {'label': 'Upper Quantile', 'type': 'number', 'max': 1.0, 'min': 0.0, 'step': 'any', 'default': '', 'required': False, 'tooltip': 'Upper quantile used to clip the intensities, maximum used when blank', 'validationMessage': 'Please enter a valid upper quantile value (number or blank)'}, 'channel_axis': {'label': 'Channel Axis', 'type': 'number', 'min': 0, 'max': 4, 'required': False, 'default': '', 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T, C, Y, X) would have channel_axis=0. When provided it will be used to compute the edges for each channel separately and merge them', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}}}, 'flow_kwargs': {'subform': True, 'title': 'Flow-field estimation', 'fields': {'enable': {'label': 'Enable flow field estimation', 'type': 'checkbox', 'default': False, 'required': True, 'tooltip': 'Enable flow field estimation', 'validationMessage': 'Please enter a valid enable value (boolean)'}, 'channel_axis': {'label': 'Channel Axis', 'type': 'number', 'min': 0, 'max': 4, 'required': False, 'default': '', 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T, C, Y, X) would have channel_axis=0. If not provided assumes first axis after time', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}, 'im_factor': {'label': 'Image space down scaling factor', 'type': 'number', 'min': 1, 'default': 4, 'required': True, 'step': 'any', 'tooltip': 'Image space down scaling factor, by default 4', 'validationMessage': 'Please enter a valid image factor value (number)'}, 'grid_factor': {'label': 'Grid space down scaling factor', 'type': 'number', 'min': 1, 'default': 4, 'required': True, 'step': 'any', 'tooltip': 'Grid space down scaling factor, by default 4', 'validationMessage': 'Please enter a valid grid factor value (number)'}, 'n_scales': {'label': 'Number of scales', 'type': 'number', 'min': 1, 'default': 2, 'required': True, 'tooltip': 'Number of scales used to estimate the flow field', 'validationMessage': 'Please enter a valid number of scales value (number)'}, 'lr': {'label': 'Learning rate', 'type': 'number', 'min': 0.0, 'default': 0.01, 'required': True, 'step': 'any', 'tooltip': 'Learning rate used to estimate the flow field', 'validationMessage': 'Please enter a valid learning rate value (number)'}, 'num_iterations': {'label': 'Number of iterations', 'type': 'number', 'min': 1, 'default': 2000, 'step': 1, 'required': True, 'tooltip': 'Number of iterations used to estimate the flow field', 'validationMessage': 'Please enter a valid number of iterations value (number)'}}}}}}
forms_metadata["additional_options"] = {'title': 'Pre-processing', 'fields': {'label_to_contours_kwargs': {'subform': True, 'title': 'Label to Contours', 'fields': {'sigma': {'label': 'Sigma', 'type': 'number', 'min': 0.0, 'step': 'any', 'tooltip': "Contours smoothing parameter (gaussian blur), contours aren't smoothed if not provided", 'validationMessage': 'Please enter a valid sigma value (number or blank)'}}}, 'detect_foreground_kwargs': {'subform': True, 'title': 'Detect Foreground', 'fields': {'sigma': {'label': 'Sigma', 'type': 'number', 'default': 15.0, 'min': 0.0, 'step': 'any', 'required': True, 'tooltip': 'Sigma used to estimate background, napari layer scale is used to convert Sigma to physical space.', 'validationMessage': 'Please enter a valid sigma value (number)'}, 'remove_hist_mode': {'label': 'Remove Histogram Mode', 'type': 'checkbox', 'default': False, 'required': False, 'tooltip': 'Removes histogram mode before computing otsu threshold, useful when background regions are being detected', 'validationMessage': 'Please enter a valid remove histogram mode value (boolean)'}, 'min_foreground': {'label': 'Min Foreground', 'type': 'number', 'min': 0.0, 'step': 'any', 'default': 0.0, 'required': True, 'tooltip': 'Minimum value of foreground pixels after background subtraction and smoothing', 'validationMessage': 'Please enter a valid min foreground value (number)'}, 'channel_axis': {'label': 'Channel Axis', 'type': 'number', 'min': 0, 'max': 4, 'required': False, 'default': '', 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T, C, Y, X) would have channel_axis=0. When provided it will be used to compute the foreground mask for each channel separately and merge them', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}}}, 'robust_invert_kwargs': {'subform': True, 'title': 'Robust Invert', 'fields': {'sigma': {'label': 'Sigma', 'type': 'number', 'min': 0.0, 'default': 1.0, 'required': True, 'step': 'any', 'tooltip': 'Sigma used to smooth the image, napari layer scale is used to convert Sigma to physical space.', 'validationMessage': 'Please enter a valid sigma value (number)'}, 'lower_quantile': {'label': 'Lower Quantile', 'type': 'number', 'max': 1.0, 'min': 0.0, 'default': '', 'step': 'any', 'required': False, 'tooltip': 'Lower quantile used to clip the intensities, minimum used when blank', 'validationMessage': 'Please enter a valid lower quantile value (number or blank)'}, 'upper_quantile': {'label': 'Upper Quantile', 'type': 'number', 'max': 1.0, 'min': 0.0, 'step': 'any', 'default': '', 'required': False, 'tooltip': 'Upper quantile used to clip the intensities, maximum used when blank', 'validationMessage': 'Please enter a valid upper quantile value (number or blank)'}, 'channel_axis': {'label': 'Channel Axis', 'type': 'number', 'min': 0, 'max': 4, 'required': False, 'default': '', 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T, C, Y, X) would have channel_axis=0. When provided it will be used to compute the edges for each channel separately and merge them', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}}}, 'flow_kwargs': {'subform': True, 'title': 'Flow-field estimation', 'fields': {'enable': {'label': 'Enable flow field estimation', 'type': 'checkbox', 'default': False, 'required': True, 'tooltip': 'Enable flow field estimation', 'validationMessage': 'Please enter a valid enable value (boolean)'}, 'channel_axis': {'label': 'Channel Axis', 'type': 'number', 'min': 0, 'max': 4, 'required': False, 'default': '', 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T, C, Y, X) would have channel_axis=0. If not provided assumes first axis after time', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}, 'im_factor': {'label': 'Image space down scaling factor', 'type': 'number', 'min': 1, 'default': 4, 'required': True, 'step': 'any', 'tooltip': 'Image space down scaling factor, by default 4', 'validationMessage': 'Please enter a valid image factor value (number)'}, 'grid_factor': {'label': 'Grid space down scaling factor', 'type': 'number', 'min': 1, 'default': 4, 'required': True, 'step': 'any', 'tooltip': 'Grid space down scaling factor, by default 4', 'validationMessage': 'Please enter a valid grid factor value (number)'}, 'n_scales': {'label': 'Number of scales', 'type': 'number', 'min': 1, 'default': 2, 'required': True, 'tooltip': 'Number of scales used to estimate the flow field', 'validationMessage': 'Please enter a valid number of scales value (number)'}, 'lr': {'label': 'Learning rate', 'type': 'number', 'min': 0.0, 'default': 0.01, 'required': True, 'step': 'any', 'tooltip': 'Learning rate used to estimate the flow field', 'validationMessage': 'Please enter a valid learning rate value (number)'}, 'num_iterations': {'label': 'Number of iterations', 'type': 'number', 'min': 1, 'default': 2000, 'step': 1, 'required': True, 'tooltip': 'Number of iterations used to estimate the flow field', 'validationMessage': 'Please enter a valid number of iterations value (number)'}}}}}
self = <ultrack.widgets.ultrackwidget.data_forms.DataForms object at 0x000001DA51795190> 104 self._create_form("segmentation", forms_metadata["segmentation"])
105 self._create_form("linking", forms_metadata["linking"])

File ~\anaconda3\envs\ultrack\Lib\site-packages\ultrack\widgets\ultrackwidget\data_forms.py:146, in DataForms._create_form(self=<ultrack.widgets.ultrackwidget.data_forms.DataForms object>, id_form='additional_options', metadata={'fields': {'detect_foreground_kwargs': {'fields': {'channel_axis': {'default': '', 'label': 'Channel Axis', 'max': 4, 'min': 0, 'required': False, 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T...d mask for each channel separately and merge them', 'type': 'number', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}, 'min_foreground': {'default': 0.0, 'label': 'Min Foreground', 'min': 0.0, 'required': True, 'step': 'any', 'tooltip': 'Minimum value of foreground pixels after background subtraction and smoothing', 'type': 'number', 'validationMessage': 'Please enter a valid min foreground value (number)'}, 'remove_hist_mode': {'default': False, 'label': 'Remove Histogram Mode', 'required': False, 'tooltip': 'Removes histogram mode before computing otsu thr...useful when background regions are being detected', 'type': 'checkbox', 'validationMessage': 'Please enter a valid remove histogram mode value (boolean)'}, 'sigma': {'default': 15.0, 'label': 'Sigma', 'min': 0.0, 'required': True, 'step': 'any', 'tooltip': 'Sigma used to estimate background, napari layer scale is used to convert Sigma to physical space.', 'type': 'number', 'validationMessage': 'Please enter a valid sigma value (number)'}}, 'subform': True, 'title': 'Detect Foreground'}, 'flow_kwargs': {'fields': {'enable': {'default': False, 'label': 'Enable flow field estimation', 'required': True, 'tooltip': 'Enable flow field estimation', 'type': 'checkbox', 'validationMessage': 'Please enter a valid enable value (boolean)'}, 'channel_axis': {'default': '', 'label': 'Channel Axis', 'max': 4, 'min': 0, 'required': False, 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T...0`. If not provided assumes first axis after time', 'type': 'number', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}, 'grid_factor': {'default': 4, 'label': 'Grid space down scaling factor', 'min': 1, 'required': True, 'step': 'any', 'tooltip': 'Grid space down scaling factor, by default 4', 'type': 'number', 'validationMessage': 'Please enter a valid grid factor value (number)'}, 'im_factor': {'default': 4, 'label': 'Image space down scaling factor', 'min': 1, 'required': True, 'step': 'any', 'tooltip': 'Image space down scaling factor, by default 4', 'type': 'number', 'validationMessage': 'Please enter a valid image factor value (number)'}, 'lr': {'default': 0.01, 'label': 'Learning rate', 'min': 0.0, 'required': True, 'step': 'any', 'tooltip': 'Learning rate used to estimate the flow field', 'type': 'number', 'validationMessage': 'Please enter a valid learning rate value (number)'}, 'n_scales': {'default': 2, 'label': 'Number of scales', 'min': 1, 'required': True, 'tooltip': 'Number of scales used to estimate the flow field', 'type': 'number', 'validationMessage': 'Please enter a valid number of scales value (number)'}, 'num_iterations': {'default': 2000, 'label': 'Number of iterations', 'min': 1, 'required': True, 'step': 1, 'tooltip': 'Number of iterations used to estimate the flow field', 'type': 'number', 'validationMessage': 'Please enter a valid number of iterations value (number)'}}, 'subform': True, 'title': 'Flow-field estimation'}, 'label_to_contours_kwargs': {'fields': {'sigma': {'label': 'Sigma', 'min': 0.0, 'step': 'any', 'tooltip': "Contours smoothing parameter (gaussian blur), contours aren't smoothed if not provided", 'type': 'number', 'validationMessage': 'Please enter a valid sigma value (number or blank)'}}, 'subform': True, 'title': 'Label to Contours'}, 'robust_invert_kwargs': {'fields': {'channel_axis': {'default': '', 'label': 'Channel Axis', 'max': 4, 'min': 0, 'required': False, 'tooltip': 'Channel axis EXCLUDING TIME (first axis), e.g (T... edges for each channel separately and merge them', 'type': 'number', 'validationMessage': 'Please enter a valid channel axis value (number or blank)'}, 'lower_quantile': {'default': '', 'label': 'Lower Quantile', 'max': 1.0, 'min': 0.0, 'required': False, 'step': 'any', 'tooltip': 'Lower quantile used to clip the intensities, minimum used when blank', 'type': 'number', 'validationMessage': 'Please enter a valid lower quantile value (number or blank)'}, 'sigma': {'default': 1.0, 'label': 'Sigma', 'min': 0.0, 'required': True, 'step': 'any', 'tooltip': 'Sigma used to smooth the image, napari layer scale is used to convert Sigma to physical space.', 'type': 'number', 'validationMessage': 'Please enter a valid sigma value (number)'}, 'upper_quantile': {'default': '', 'label': 'Upper Quantile', 'max': 1.0, 'min': 0.0, 'required': False, 'step': 'any', 'tooltip': 'Upper quantile used to clip the intensities, maximum used when blank', 'type': 'number', 'validationMessage': 'Please enter a valid upper quantile value (number or blank)'}}, 'subform': True, 'title': 'Robust Invert'}}, 'title': 'Pre-processing'})
143 id_field, field_metadata = fields_to_be_added.pop(0)
145 if not field_metadata.get("subform", False):
--> 146 self._create_field(
self = <ultrack.widgets.ultrackwidget.data_forms.DataForms object at 0x000001DA51795190>
layout = <PyQt5.QtWidgets.QVBoxLayout object at 0x000001DA658A2050>
current_subform = 'label_to_contours_kwargs'
id_field = 'sigma'
field_metadata = {'label': 'Sigma', 'type': 'number', 'min': 0.0, 'step': 'any', 'tooltip': "Contours smoothing parameter (gaussian blur), contours aren't smoothed if not provided", 'validationMessage': 'Please enter a valid sigma value (number or blank)'}
id_form = 'additional_options' 147 layout, id_form, id_field, field_metadata, current_subform
148 )
149 else:
150 subgroup = QGroupBox(field_metadata["title"])

File ~\anaconda3\envs\ultrack\Lib\site-packages\ultrack\widgets\ultrackwidget\data_forms.py:189, in DataForms._create_field(self=<ultrack.widgets.ultrackwidget.data_forms.DataForms object>, layout=<PyQt5.QtWidgets.QVBoxLayout object>, id_form='additional_options', id_field='sigma', field_metadata={'label': 'Sigma', 'min': 0.0, 'step': 'any', 'tooltip': "Contours smoothing parameter (gaussian blur), contours aren't smoothed if not provided", 'type': 'number', 'validationMessage': 'Please enter a valid sigma value (number or blank)'}, current_subform='label_to_contours_kwargs')
187 if field_metadata["type"] == "number":
188 label = QLabel(f'{field_metadata["label"]} {chr(0xF059)}')
--> 189 label.setFont(qta.font("fa", 14))
label = <PyQt5.QtWidgets.QLabel object at 0x000001DA658A20E0>
qta = <module 'qtawesome' from 'C:\Users\adamk\anaconda3\envs\ultrack\Lib\site-packages\qtawesome\init.py'> 190 label.setToolTip(field_metadata["tooltip"])
191 layout.addWidget(label)

File ~\anaconda3\envs\ultrack\Lib\site-packages\qtawesome_init_.py:351, in font(prefix='fa', size=14)
331 def font(prefix, size):
332 """
333 Return the font corresponding to the specified prefix.
334
(...) 349
350 """
--> 351 return _instance().font(prefix, size)
prefix = 'fa'
size = 14
File ~\anaconda3\envs\ultrack\Lib\site-packages\qtawesome\iconic_font.py:573, in IconicFont.font(self=<qtawesome.iconic_font.IconicFont object>, prefix='fa', size=14)
571 """Return a QFont corresponding to the given prefix and size."""
572 font = QFont()
--> 573 font.setFamily(self.fontname[prefix])
font = <PyQt5.QtGui.QFont object at 0x000001DA658C66C0>
self.fontname = {'fa5': 'Font Awesome 5 Free Regular', 'fa5s': 'Font Awesome 5 Free Solid', 'fa5b': 'Font Awesome 5 Brands Regular', 'fa6': 'Font Awesome 6 Free Regular', 'fa6s': 'Font Awesome 6 Free Solid', 'fa6b': 'Font Awesome 6 Brands Regular', 'ei': 'elusiveicons', 'mdi': 'Material Design Icons 5.9.55', 'mdi6': 'Material Design Icons', 'ph': 'Phosphor', 'ri': 'remixicon', 'msc': 'codicon'}
prefix = 'fa'
self = <qtawesome.iconic_font.IconicFont object at 0x000001DA658A2290> 574 font.setPixelSize(round(size))
575 if prefix[-1] == "s": # solid style

KeyError: 'fa'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions