添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Hi everbody,
I have a bit of a general question/suggestion for Napari.

Is there currently any function, widget or plugin that allows the user to define a scale (pixel size) for a specific layer?
I’m thinking of something like the ImageJ tool “Set Scale”
I know how to adjust the image scaling programmatically but it would be great to have a GUI option to do so.

You can easily do:
viewer.layers[‘your_layers_name’].scale = [3, 1, 1]
With the values corresponding to : [z,y,x]
Can also be a tuple.

edit:
Didn’t read the post fully.
the napari-pyclesperanto-assistant plugin has a utilities ‘set voxel’, and ‘set voxel of all layers’ under tools> utilities> .

Hi @andreas.m.arnold ,

the napari-pyclesperanto-assistant has this functionality.

You can also read the voxel size using the napari-layer-details-display .

Both come together in the devbio-napari distribution.

Let us know if this works for you.

Best,
Robert

Hi @haesleinhuepf
I tried installing mamba and devbio-napari following the instructions in devbio-napari .

While installing mamba with

conda install mamba -c conda-forge

seems to have worked, I now get an error when trying to create an environment with

mamba create --name devbio-napari-env python=3.9 devbio-napari -c conda-forge -c pytorch

The error message is:

argument COMMAND: conflicting subparser: repoquery
# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<
    Traceback (most recent call last):
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\conda\exception_handler.py", line 17, in __call__
        return func(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 945, in exception_converter
        raise e
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 938, in exception_converter
        exit_code = _wrapped_main(*args, **kwargs)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 877, in _wrapped_main
        configure_parser_repoquery(p._subparsers._group_actions[0])
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 805, in configure_parser_repoquery
        p = sub_parsers.add_parser(
            ^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\argparse.py", line 1192, in add_parser
        raise ArgumentError(self, _('conflicting subparser: %s') % name)
    argparse.ArgumentError: argument COMMAND: conflicting subparser: repoquery
`$ C:\Users\arnoldam\AppData\Local\anaconda3\Scripts\mamba create --name devbio-napari-env python=3.9 devbio-napari -c conda-forge -c pytorch`
  environment variables:
                 CIO_TEST=<not set>
        CONDA_DEFAULT_ENV=base
                CONDA_EXE=C:\Users\arnoldam\AppData\Local\anaconda3\condabin\..\Scripts\conda.ex
               CONDA_EXES="C:\Users\arnoldam\AppData\Local\anaconda3\condabin\..\Scripts\conda.e
             CONDA_PREFIX=C:\Users\arnoldam\AppData\Local\anaconda3
    CONDA_PROMPT_MODIFIER=(base)
         CONDA_PYTHON_EXE=C:\Users\arnoldam\AppData\Local\anaconda3\python.exe
               CONDA_ROOT=C:\Users\arnoldam\AppData\Local\anaconda3
              CONDA_SHLVL=1
                CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
           CURL_CA_BUNDLE=<not set>
                 HOMEPATH=\
               LD_PRELOAD=<not set>
          NVTOOLSEXT_PATH=C:\Program Files\NVIDIA Corporation\NvToolsExt\
                     PATH=C:\Users\arnoldam\AppData\Local\anaconda3;C:\Users\arnoldam\AppData\Lo
                          cal\anaconda3\Library\mingw-
                          w64\bin;C:\Users\arnoldam\AppData\Local\anaconda3\Library\usr\bin;C:\U
                          sers\arnoldam\AppData\Local\anaconda3\Library\bin;C:\Users\arnoldam\Ap
                          pData\Local\anaconda3\Scripts;C:\Users\arnoldam\AppData\Local\anaconda
                          3\bin;C:\Users\arnoldam\AppData\Local\anaconda3\condabin;C:\Program
                          Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files\NVIDIA
                          GPU Computing Toolkit\CUDA\v10.0\bin;C:\Program Files\NVIDIA GPU
                          Computing Toolkit\CUDA\v10.0\libnvvp;C:\cygwin64\bin;C:\cygwin64\usr\l
                          ocal\IMOD\bin;C:\Program Files (x86)\Intel\Intel(R) Management Engine
                          Components\iCLS;C:\Program Files\Intel\Intel(R) Management Engine Comp
                          onents\iCLS;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:
                          \windows\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\HID
                          Global\ActivClient;C:\Program Files\HID Global\ActivClient;C:\Program
                          Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program
                          Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files
                          (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program
                          Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program
                          Files\Microsoft VS Code\bin;C:\Program Files (x86)\NVIDIA
                          Corporation\PhysX\Common;C:\Program
                          Files\MATLAB\R2023a\runtime\win64;C:\Program
                          Files\MATLAB\R2023a\bin;C:\Program Files\dotnet;C:\Program
                          Files\Git\cmd;C:\Users\arnoldam\AppData\Local\Microsoft\WindowsApps;.
             PSMODULEPATH=C:\Program Files\WindowsPowerShell\Modules;C:\windows\system32\Windows
                          PowerShell\v1.0\Modules
       REQUESTS_CA_BUNDLE=<not set>
            SSL_CERT_FILE=<not set>
     active environment : base
    active env location : C:\Users\arnoldam\AppData\Local\anaconda3
            shell level : 1
       user config file : C:\Users\arnoldam\.condarc
 populated config files :
          conda version : 23.7.4
    conda-build version : 3.27.0
         python version : 3.11.5.final.0
       virtual packages : __archspec=1=x86_64
                          __cuda=11.7=0
                          __win=0=0
       base environment : C:\Users\arnoldam\AppData\Local\anaconda3  (writable)
      conda av data dir : C:\Users\arnoldam\AppData\Local\anaconda3\etc\conda
  conda av metadata url : None
           channel URLs : https://repo.anaconda.com/pkgs/main/win-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/win-64
                          https://repo.anaconda.com/pkgs/r/noarch
                          https://repo.anaconda.com/pkgs/msys2/win-64
                          https://repo.anaconda.com/pkgs/msys2/noarch
          package cache : C:\Users\arnoldam\AppData\Local\anaconda3\pkgs
                          C:\Users\arnoldam\.conda\pkgs
                          C:\Users\arnoldam\AppData\Local\conda\conda\pkgs
       envs directories : C:\Users\arnoldam\AppData\Local\anaconda3\envs
                          C:\Users\arnoldam\.conda\envs
                          C:\Users\arnoldam\AppData\Local\conda\conda\envs
               platform : win-64
             user-agent : conda/23.7.4 requests/2.31.0 CPython/3.11.5 Windows/10 Windows/10.0.19045
          administrator : False
             netrc file : None
           offline mode : False
An unexpected error has occurred. Conda has prepared the above report.
If you suspect this error is being caused by a malfunctioning plugin,
consider using the --no-plugins option to turn off plugins.
Example: conda --no-plugins install <package>
Alternatively, you can set the CONDA_NO_PLUGINS environment variable on
the command line to run the command without plugins enabled.
Example: CONDA_NO_PLUGINS=true conda install <package>

Do you have an idea what’s happening here? Might it be a problem with using a full anaconda distribution instead of miniconda?

Also, is there any best practice as to what “version” of Napari to use as a base install? I keep running into issues where different plugins seem to be incompatible. Hence I’m a bit worried about installing a big plugin like devbio-napari (is it even a plugin or am I mistaken) for something small like adding a scale.

I’m just wondering how to best use Napari to avoid such issues as much as possible.

Small addition:
I get the same (or at least a similar) error when trying to install an empty environment with

mamba create -y -n test-env -c conda-forge python=3.10

The error is:

argument COMMAND: conflicting subparser: repoquery
# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<
    Traceback (most recent call last):
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\conda\exception_handler.py", line 17, in __call__
        return func(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 945, in exception_converter
        raise e
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 938, in exception_converter
        exit_code = _wrapped_main(*args, **kwargs)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 877, in _wrapped_main
        configure_parser_repoquery(p._subparsers._group_actions[0])
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\site-packages\mamba\mamba.py", line 805, in configure_parser_repoquery
        p = sub_parsers.add_parser(
            ^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\arnoldam\AppData\Local\anaconda3\Lib\argparse.py", line 1192, in add_parser
        raise ArgumentError(self, _('conflicting subparser: %s') % name)
    argparse.ArgumentError: argument COMMAND: conflicting subparser: repoquery
`$ C:\Users\arnoldam\AppData\Local\anaconda3\Scripts\mamba create -y -n test-env -c conda-forge python=3.10`
  environment variables:
                 CIO_TEST=<not set>
        CONDA_DEFAULT_ENV=base
                CONDA_EXE=C:\Users\arnoldam\AppData\Local\anaconda3\condabin\..\Scripts\conda.ex
             CONDA_PREFIX=C:\Users\arnoldam\AppData\Local\anaconda3
    CONDA_PROMPT_MODIFIER=(base)
         CONDA_PYTHON_EXE=C:\Users\arnoldam\AppData\Local\anaconda3\python.exe
               CONDA_ROOT=C:\Users\arnoldam\AppData\Local\anaconda3
              CONDA_SHLVL=1
                CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
           CURL_CA_BUNDLE=<not set>
                 HOMEPATH=\
               LD_PRELOAD=<not set>
          NVTOOLSEXT_PATH=C:\Program Files\NVIDIA Corporation\NvToolsExt\
                     PATH=C:\Users\arnoldam\AppData\Local\anaconda3;C:\Users\arnoldam\AppData\Lo
                          cal\anaconda3\Library\mingw-
                          w64\bin;C:\Users\arnoldam\AppData\Local\anaconda3\Library\usr\bin;C:\U
                          sers\arnoldam\AppData\Local\anaconda3\Library\bin;C:\Users\arnoldam\Ap
                          pData\Local\anaconda3\Scripts;C:\Users\arnoldam\AppData\Local\anaconda
                          3\bin;C:\Users\arnoldam\AppData\Local\anaconda3\condabin;C:\Program
                          Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files\NVIDIA
                          GPU Computing Toolkit\CUDA\v10.0\bin;C:\Program Files\NVIDIA GPU
                          Computing Toolkit\CUDA\v10.0\libnvvp;C:\cygwin64\bin;C:\cygwin64\usr\l
                          ocal\IMOD\bin;C:\Program Files (x86)\Intel\Intel(R) Management Engine
                          Components\iCLS;C:\Program Files\Intel\Intel(R) Management Engine Comp
                          onents\iCLS;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:
                          \windows\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\HID
                          Global\ActivClient;C:\Program Files\HID Global\ActivClient;C:\Program
                          Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program
                          Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files
                          (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program
                          Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program
                          Files\Microsoft VS Code\bin;C:\Program Files (x86)\NVIDIA
                          Corporation\PhysX\Common;C:\Program
                          Files\MATLAB\R2023a\runtime\win64;C:\Program
                          Files\MATLAB\R2023a\bin;C:\Program Files\dotnet;C:\Program
                          Files\Git\cmd;C:\Users\arnoldam\AppData\Local\Microsoft\WindowsApps;.
             PSMODULEPATH=C:\Program Files\WindowsPowerShell\Modules;C:\windows\system32\Windows
                          PowerShell\v1.0\Modules
       REQUESTS_CA_BUNDLE=<not set>
            SSL_CERT_FILE=<not set>
     active environment : base
    active env location : C:\Users\arnoldam\AppData\Local\anaconda3
            shell level : 1
       user config file : C:\Users\arnoldam\.condarc
 populated config files :
          conda version : 23.7.4
    conda-build version : 3.27.0
         python version : 3.11.5.final.0
       virtual packages : __archspec=1=x86_64
                          __cuda=11.7=0
                          __win=0=0
       base environment : C:\Users\arnoldam\AppData\Local\anaconda3  (writable)
      conda av data dir : C:\Users\arnoldam\AppData\Local\anaconda3\etc\conda
  conda av metadata url : None
           channel URLs : https://repo.anaconda.com/pkgs/main/win-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/win-64
                          https://repo.anaconda.com/pkgs/r/noarch
                          https://repo.anaconda.com/pkgs/msys2/win-64
                          https://repo.anaconda.com/pkgs/msys2/noarch
          package cache : C:\Users\arnoldam\AppData\Local\anaconda3\pkgs
                          C:\Users\arnoldam\.conda\pkgs
                          C:\Users\arnoldam\AppData\Local\conda\conda\pkgs
       envs directories : C:\Users\arnoldam\AppData\Local\anaconda3\envs
                          C:\Users\arnoldam\.conda\envs
                          C:\Users\arnoldam\AppData\Local\conda\conda\envs
               platform : win-64
             user-agent : conda/23.7.4 requests/2.31.0 CPython/3.11.5 Windows/10 Windows/10.0.19045
          administrator : False
             netrc file : None
           offline mode : False
An unexpected error has occurred. Conda has prepared the above report.
If you suspect this error is being caused by a malfunctioning plugin,
consider using the --no-plugins option to turn off plugins.
Example: conda --no-plugins install <package>
Alternatively, you can set the CONDA_NO_PLUGINS environment variable on
the command line to run the command without plugins enabled.
Example: CONDA_NO_PLUGINS=true conda install <package>

So it seems to be an issue with mamba rather than devbio-napari (?)

That’s a bit inconvenient because I need to get IT for that (at NIH we need IT for most anything because of the security system :sob:) but I can definitly reinstall it…

Would it be better to use miniconda? I just used anaconda because I wanted to try out the QtDesigner that comes with it…
I’m just wondering if I can make my life easier.

Edit: I believe I originally misunderstood your answer… you are saying I should install mambaforge instead of anaconda?

### Solution to issue cannot be found in the documentation. - [X] I checked the

hi @psobolewskiPhD
Thx for the tip!

In the end uninstalling anaconda and installing mambaforge instead solved this issue for me.

However, devbio-napari still doesn’t work

I get this error when trying to run

naparia

in my environment.

(devbio-napari-env) C:\>naparia
Traceback (most recent call last):
  File "C:\Users\arnoldam\AppData\Local\miniforge3\envs\devbio-napari-env\Scripts\naparia-script.py", line 5, in <module>
    from napari_assistant import main
  File "C:\Users\arnoldam\AppData\Local\miniforge3\envs\devbio-napari-env\lib\site-packages\napari_assistant\__init__.py", line 1, in <module>
    from ._gui import Assistant
  File "C:\Users\arnoldam\AppData\Local\miniforge3\envs\devbio-napari-env\lib\site-packages\napari_assistant\_gui\__init__.py", line 1, in <module>
    from ._Assistant import Assistant
  File "C:\Users\arnoldam\AppData\Local\miniforge3\envs\devbio-napari-env\lib\site-packages\napari_assistant\_gui\_Assistant.py", line 10, in <module>
    from ._button_grid import ButtonGrid, _get_highlight_brush, _get_background_brush
  File "C:\Users\arnoldam\AppData\Local\miniforge3\envs\devbio-napari-env\lib\site-packages\napari_assistant\_gui\_button_grid.py", line 1, in <module>
    from pyrsistent import b
ModuleNotFoundError: No module named 'pyrsistent'
              

Maybe @haesleinhuepf has better idea, but it looks like you have an older version Napari-assistant – that bug was fixed in remove import of pyresistant by haesleinhuepf · Pull Request #48 · haesleinhuepf/napari-assistant · GitHub

Can you give output of pip show napari-assistant ?

To fix you can try:
pip install pyrsistent

Hi @andreas.m.arnold,

our napari-bigfish plugin also allows to set the scale (but only in nm). I know how easy it is to do this from the built-in console, but I think this is so important and expected by users that it should be part of the base-napari. Until then, it would be easy enough to write a plugin that does only this, but I do not have the time right now.

Best,
Volker

Hi @volker ,
I agree that this seems to be something that would be great as a tool in base-napari.
Maybe I can look into building small plugin for only this. Could you point out your github repo as inspiration on how to do this?

Hi @andreas.m.arnold,
sorry I was wrong. It actually asks the scale for batch processing, but doesn’t apply it to the displayed image, I thought it also did that.

Clément who is working with me is going to write the “set scale” plugin tomorrow. It can be very simple. Just a magicgui interface asking for xy-voxel size, z-voxel size and the unit as a string. It shouldn’t take him more than an hour to do this.

The layer object has an attribute scale which is a list of the scales of the different dimensions. I don’t remember the order, but it’s something like the last three are z, y and x and the unit goes to the scale-bar (viewer.scale_bar.unit).

Best,
Volker

Volker Bäcker:

It can be very simple. Just a magicgui interface asking for xy-voxel size, z-voxel size and the unit as a string. It shouldn’t take him more than an hour to do this.

Feel free to copy from here. :wink:

Thanks for the hint @haesleinhuepf ! This is great to build at least a temporary solution for myself :grinning:

I still think it would be great to have this as a small general plugin like @volker suggested! Please reach out if I can help or contribute!
I am not a software engineer but excited to learn more about Napari.

Thanks @haesleinhuepf for your code example!
I just finished a beta of the plugin (a poorly named version), it’s available on PyPI (set-calibration · PyPI)
Have fun trying to break it, and have a great weekend.

andy-sweet/napari-metadata/blob/e6da33db23bbdaf385daaed16564f5193d0717d9/src/napari_metadata/_axes_widget.py

from typing import TYPE_CHECKING, List, Tuple
from qtpy.QtCore import Qt
from qtpy.QtWidgets import QComboBox, QGridLayout, QLabel, QLineEdit, QWidget
from napari_metadata._axis_type import AxisType
from napari_metadata._model import (
    Axis,
    ChannelAxis,
    SpaceAxis,
    TimeAxis,
    coerce_extra_metadata,
from napari_metadata._space_units import SpaceUnits
from napari_metadata._time_units import TimeUnits
from napari_metadata._widget_utils import (
    CompactLineEdit,
    readonly_lineedit,
    set_row_visible,
    update_num_rows,

From a quick skim I think it’s the most robust on this thread because it works for an arbitrary number and type of axes. :blush: (Well, as long as the type is one of time, space, and channel. :sweat_smile: but it’s not just xyz is what I mean. :sweat_smile:) (The need for this flexibility is part of the reason why we still don’t have an official widget btw… :disappointed: But we all agree that it needs to be in there, if someone wants to have a stab at putting it in built-ins…)

Andy has given me permission to grab it as a basis for a standalone plugin, and I presume that permission extends to anyone here. (And anyway the BSD license allows it as long as you acknowledge the source. :blush:)

Hi @jni,
yes, that looks more elaborated :slight_smile: .

I installed it (napari: 0.4.18). I get ‘value is invalid’ when I want to open it and it doesn’t show up. The error also repeats each time I open a new image or select a layer afterwards.

Do I need a different version of napari or of some libaries for this to work?

Best,
Volker

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari/_qt/menus/plugins_menu.py:105, in PluginsMenu._add_plugin_actions.<locals>._add_toggle_widget(key=('napari-metadata', 'Layer metadata'), hook_type='dock')
    102     return
    104 if hook_type == 'dock':
--> 105     self._win.add_plugin_dock_widget(*key)
        key = ('napari-metadata', 'Layer metadata')
        self._win = <napari._qt.qt_main_window.Window object at 0x7fd6ac006100>
        self = <napari._qt.menus.plugins_menu.PluginsMenu object at 0x7fd6199cf5e0>
    106 else:
    107     self._win._add_plugin_function_widget(*key)
File ~/mambaforge/envs/napari-env/lib/python3.9/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-metadata', widget_name='Layer metadata', tabify=False)
    808         wdg = wdg._magic_widget
    809     return dock_widget, wdg
--> 811 wdg = _instantiate_dock_widget(
        Widget = <class 'napari_metadata._widget.MetadataWidget'>
        self = <napari._qt.qt_main_window.Window object at 0x7fd6ac006100>
    812     Widget, cast('Viewer', self._qt_viewer.viewer)
    813 )
    815 # Add dock widget
    816 dock_kwargs.pop('name', None)
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari/_qt/qt_main_window.py:1465, in _instantiate_dock_widget(wdg_cls=<class 'napari_metadata._widget.MetadataWidget'>, viewer=Viewer(camera=Camera(center=(7.5, 255.5, 255.5),...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
   1464 # instantiate the widget
-> 1465 return wdg_cls(**kwargs)
        kwargs = {'napari_viewer': Viewer(camera=Camera(center=(7.5, 255.5, 255.5), zoom=1.7793945312500001, angles=(-18.9960157284967, 5.633093956399732, 137.20513121194864), perspective=0.0, mouse_pan=True, mouse_zoom=True), cursor=Cursor(position=(124.15804477121566, 327.72926224793184, 521.6704418506295), scaled=True, size=1, style=<CursorStyle.STANDARD: 'standard'>), dims=Dims(ndim=3, ndisplay=3, last_used=2, range=((0.0, 16.0, 1.0), (0.0, 512.0, 1.0), (0.0, 512.0, 1.0)), current_step=(7, 255, 255), order=(0, 1, 2), axis_labels=('0', '2', '3')), grid=GridCanvas(stride=1, shape=(-1, -1), enabled=False), layers=[<Image layer 'nuclei' at 0x7fd53c4b2eb0>], help='use <2> for transform', status={'layer_base': 'nuclei', 'source_type': 'sample', 'plugin': 'napari builtins', 'coordinates': ' [124 328 522]'}, tooltip=Tooltip(visible=True, text=''), theme='dark', title='napari', mouse_over_canvas=True, mouse_move_callbacks=[], mouse_drag_callbacks=[], mouse_double_click_callbacks=[], mouse_wheel_callbacks=[<function dims_scroll at 0x7fd6d1acdca0>], _persisted_mouse_event={}, _mouse_drag_gen={}, _mouse_wheel_gen={}, keymap={})}
        wdg_cls = <class 'napari_metadata._widget.MetadataWidget'>
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari_metadata/_widget.py:375, in MetadataWidget.__init__(self=<napari_metadata._widget.MetadataWidget object>, napari_viewer=Viewer(camera=Camera(center=(7.5, 255.5, 255.5),...ouse_drag_gen={}, _mouse_wheel_gen={}, keymap={}))
    367 self._editable_widget._temporal_units.currentTextChanged.connect(
    368     self._readonly_widget.set_temporal_units
    369 )
    371 self._viewer.layers.selection.events.changed.connect(
    372     self._on_selected_layers_changed
    373 )
--> 375 self._on_selected_layers_changed()
        self = <napari_metadata._widget.MetadataWidget object at 0x7fd69ddd4dc0>
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari_metadata/_widget.py:408, in MetadataWidget._on_selected_layers_changed(self=<napari_metadata._widget.MetadataWidget object>)
    405     coerce_extra_metadata(self._viewer, layer)
    407 self._readonly_widget.set_selected_layer(layer)
--> 408 self._editable_widget.set_selected_layer(layer)
        layer = <Image layer 'nuclei' at 0x7fd53c4b2eb0>
        self = <napari_metadata._widget.MetadataWidget object at 0x7fd69ddd4dc0>
        self._editable_widget = <napari_metadata._widget.EditableMetadataWidget object at 0x7fd69ddf4040>
    410 self._selected_layer = layer
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari_metadata/_widget.py:148, in EditableMetadataWidget.set_selected_layer(self=<napari_metadata._widget.EditableMetadataWidget object>, layer=<Image layer 'nuclei'>)
    145     time_unit = str(extras.get_time_unit())
    146     self._temporal_units.setCurrentText(time_unit)
--> 148 self._spacing_widget.set_selected_layer(layer)
        layer = <Image layer 'nuclei' at 0x7fd53c4b2eb0>
        self = <napari_metadata._widget.EditableMetadataWidget object at 0x7fd69ddf4040>
        self._spacing_widget = <napari_metadata._transform_widget.TransformWidget object at 0x7fd69ddf4670>
    150 self._selected_layer = layer
    151 self._update_restore_enabled()
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari_metadata/_transform_widget.py:76, in TransformWidget.set_selected_layer(self=<napari_metadata._transform_widget.TransformWidget object>, layer=<Image layer 'nuclei'>)
     74 self._layer = layer
     75 if self._layer is not None:
---> 76     self._on_layer_scale_changed()
        self = <napari_metadata._transform_widget.TransformWidget object at 0x7fd69ddf4670>
     77     self._on_layer_translate_changed()
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari_metadata/_transform_widget.py:92, in TransformWidget._on_layer_scale_changed(self=<napari_metadata._transform_widget.TransformWidget object>)
     90 widgets = self._layer_widgets()
     91 for s, w in zip(scale, widgets):
---> 92     w.spacing.setValue(s)
        s = 1.0
        w = <napari_metadata._transform_widget.TransformRow object at 0x7fd5fb3de3d0>
        w.spacing = <napari_metadata._widget_utils.DoubleLineEdit object at 0x7fd69dab9ca0>
File ~/mambaforge/envs/napari-env/lib/python3.9/site-packages/napari_metadata/_widget_utils.py:40, in DoubleLineEdit.setValue(self=<napari_metadata._widget_utils.DoubleLineEdit object>, value=1.0)
     38 state, text, _ = self.validator().validate(text, 0)
     39 if state != QValidator.State.Acceptable:
---> 40     raise ValueError("Value is invalid.")
     41 if text != self.text():
     42     super().setText(text)
ValueError: Value is invalid.
              

Hmm, I don’t know, it works fine here, even checking out 0.4.18. :sweat_smile: Could you write down exactly what you did?

I just opened napari, then File > Open Sample > napari builtins > Cells (3D + 2Ch), then Plugins > Layer metadata (napari-metadata).