Skip to content

Fix _on_view_ndims_requested  #205

@tlambert03

Description

@tlambert03

And in this case, the widget leak is just a failed cleanup after the actual error that is shown a bit higher (https://github.com/pyapp-kit/ndv/actions/runs/15305150376/job/43055857610?pr=202#step:11:393)

WARNING: Traceback (most recent call last):
  File "/Users/runner/work/ndv/ndv/.venv/bin/pytest", line 10, in <module>
    sys.exit(console_main())
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 201, in console_main
    code = main()
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/config/__init__.py", line 175, in main
    ret: ExitCode | int = config.hook.pytest_cmdline_main(config=config)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/main.py", line 330, in pytest_cmdline_main
    return wrap_session(config, _main)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/main.py", line 283, in wrap_session
    session.exitstatus = doit(config, session) or 0
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/main.py", line 337, in _main
    config.hook.pytest_runtestloop(session=session)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/main.py", line 362, in pytest_runtestloop
    item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 113, in pytest_runtest_protocol
    runtestprotocol(item, nextitem=nextitem)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 132, in runtestprotocol
    reports.append(call_and_report(item, "call", log))
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 241, in call_and_report
    call = CallInfo.from_call(
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/Users/runner/work/ndv/ndv/tests/test_controller.py", line 255, in test_array_viewer_with_app
    process_events()
  File "/Users/runner/work/ndv/ndv/src/ndv/views/_app.py", line 344, in process_events
    ndv_app().process_events()
  File "/Users/runner/work/ndv/ndv/src/ndv/views/_qt/_app.py", line 85, in process_events
    QApplication.processEvents()
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/app/backends/_qt.py", line 626, in event
    out = super(QtBaseCanvasBackend, self).event(ev)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/app/backends/_qt.py", line 928, in paintGL
    self._vispy_canvas.events.draw(region=None)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/util/event.py", line 453, in __call__
    self._invoke_callback(cb, event)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/util/event.py", line 471, in _invoke_callback
    _handle_exception(self.ignore_callback_errors,
  << caught exception here: >>
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/util/event.py", line 469, in _invoke_callback
    cb(event)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/scene/canvas.py", line 219, in on_draw
    self._draw_scene()
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/scene/canvas.py", line 278, in _draw_scene
    self.draw_visual(self.scene)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/scene/canvas.py", line 316, in draw_visual
    node.draw()
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/scene/visuals.py", line 106, in draw
    self._visual_superclass.draw(self)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/visuals/visual.py", line 505, in draw
    if self._prepare_draw(view=self) is False:
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/visuals/image.py", line 677, in _prepare_draw
    self._build_texture()
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/visuals/image.py", line 618, in _build_texture
    self._texture.scale_and_set_data(self._data, copy=False)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/visuals/_scalable_textures.py", line 447, in scale_and_set_data
    self._reformat_if_necessary(data)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/visuals/_scalable_textures.py", line 440, in _reformat_if_necessary
    self._resize(data.shape, internalformat=internalformat)
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/gloo/texture.py", line 324, in _resize
    shape = self._normalize_shape(shape)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/runner/work/ndv/ndv/.venv/lib/python3.12/site-packages/vispy/gloo/texture.py", line 193, in _normalize_shape
    raise ValueError("Too many channels for texture")
ValueError: Too many channels for texture
ERROR: Invoking <bound method SceneCanvas.on_draw of <SceneCanvas (PyQt6) at 0x115ec9b80>> for DrawEvent

Ah, good catch. Yeah, looks like an issue likely arising from the changes added by #196. I'm guessing it's a race condition between a 3D data request and clearing the canvas (i.e. the ImageHandle backed by a vispy image is being used for displaying 3D data when it should have been cleared and replaced by a vispy volume ImageHandle?)

Originally posted by @gselzer in #202 (comment)

@gselzer, I'm not totally following what broke here yet. Is this something you're working on?

Metadata

Metadata

Assignees

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