# Incorrect viewport is zoomed with trame.widgets.vtklocal.LocalView

**URL:** https://discourse.vtk.org/t/incorrect-viewport-is-zoomed-with-trame-widgets-vtklocal-localview/16035
**Category:** Support
**Tags:** trame
**Created:** [September 12, 2025, 9:56am UTC](https://discourse.vtk.org/t/incorrect-viewport-is-zoomed-with-trame-widgets-vtklocal-localview/16035 "2025-09-12T09:56:35Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![senanokah](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/s/b5ac83/32.png) [@senanokah](https://discourse.vtk.org/u/senanokah)
#### Post date: [September 12, 2025, 9:56am UTC](https://discourse.vtk.org/t/incorrect-viewport-is-zoomed-with-trame-widgets-vtklocal-localview/16035/1 "2025-09-12T09:56:36Z")

</div>

Hi!

First of all, thank you so much for your work on Trame/VTK/WASM.

I’ve got an issue where zooming while hovering the cursor over different render viewports always zoomes the first renderer. I’m using the `LocalView` from `trame.widgets.vtklocal`.

Relevant package versions:

```bash
$ python -V
Python 3.13.1
$ pip list | grep -e 'vtk' -e 'trame'
trame 3.12.0
trame-client 3.10.1
trame-common 1.0.1
trame-components 2.5.0
trame-server 3.6.0
trame-vtk 2.9.1
trame-vtklocal 0.15.2
trame-vuetify 3.0.2
vtk 9.5.20250531.dev0

```

Here’s fairly minimal example using the multiple viewports VTK example ([https://examples.vtk.org/site/Python/Visualization/MultipleViewports/](https://examples.vtk.org/site/Python/Visualization/MultipleViewports/)) and a simple app layout with Trame. Running in a Jupyter kernel (VS Code or split on `# %%` as individual cells in a Jupyter notebook):

```python
# %%
# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle

# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkFiltersSources import (
    vtkConeSource,
    vtkCubeSource,
    vtkCylinderSource,
    vtkSphereSource,
)
from vtk import vtkInteractorStyleTrackballCamera
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderer,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
)

from trame.app import get_server
from trame.ui.vuetify3 import VAppLayout
from trame.widgets import vtklocal, vtk as trame_vtk, vuetify3

def main(local: bool = True):
    # One render window, multiple viewports.
    rw = vtkRenderWindow()
    iren = vtkRenderWindowInteractor()
    iren.SetInteractorStyle(vtkInteractorStyleTrackballCamera())
    iren.SetRenderWindow(rw)

    # Define viewport ranges.
    xmins = [0, 0.5, 0, 0.5]
    xmaxs = [0.5, 1, 0.5, 1]
    ymins = [0, 0, 0.5, 0.5]
    ymaxs = [0.5, 0.5, 1, 1]

    sources = get_sources()
    for i in range(4):
        ren = vtkRenderer()
        rw.AddRenderer(ren)
        ren.SetViewport(xmins[i], ymins[i], xmaxs[i], ymaxs[i])

        mapper = vtkPolyDataMapper()
        mapper.SetInputConnection(sources[i].GetOutputPort())
        actor = vtkActor()
        actor.SetMapper(mapper)
        ren.AddActor(actor)

        ren.ResetCamera()

    layout = setup_trame(rw, local)

    return layout

def get_sources():
    sources = list()

    # Create a sphere
    sphere = vtkSphereSource()
    sphere.SetCenter(0.0, 0.0, 0.0)
    sphere.Update()
    sources.append(sphere)

    # Create a cone
    cone = vtkConeSource()
    cone.SetCenter(0.0, 0.0, 0.0)
    cone.SetDirection(0, 1, 0)
    cone.Update()
    sources.append(cone)

    # Create a cube
    cube = vtkCubeSource()
    cube.SetCenter(0.0, 0.0, 0.0)
    cube.Update()
    sources.append(cube)

    # Create a cylinder
    cylinder = vtkCylinderSource()
    cylinder.SetCenter(0.0, 0.0, 0.0)
    cylinder.Update()
    sources.append(cylinder)

    return sources

def setup_trame(rw: vtkRenderWindow, local: bool) -> VAppLayout:
    server = get_server(client_type="vue3")
    ctrl = server.controller

    with VAppLayout(server) as layout:
        with vuetify3.VContainer(
            fluid=True, classes="pa-0 fill-height", trame_server=server
        ):
            with vuetify3.VContainer(fluid=True, classes="pa-0 fill-height"):
                if local:
                    setup_local_view(rw, ctrl)
                else:
                    setup_remove_view(rw, ctrl)

    return layout

def setup_local_view(rw: vtkRenderWindow, controller) -> None:
    view = vtklocal.LocalView(rw)
    controller.view_update = view.update_throttle
    controller.view_reset_camera = view.reset_camera

def setup_remove_view(rw: vtkRenderWindow, controller) -> None:
    view = trame_vtk.VtkRemoteView(rw)
    controller.view_update = view.update
    controller.view_reset_camera = view.reset_camera

# %%
layout = main(local=True)
await layout.ready
layout

```

Result: [Cannot upload a short 7s video as I’m a new user.]

---

<div class="post-metadata">

### Author: ![Sebastien\_Jourdain](https://discourse.vtk.org/user_avatar/discourse.vtk.org/sebastien_jourdain/32/100_2.png) [@Sebastien\_Jourdain](https://discourse.vtk.org/u/Sebastien_Jourdain)
#### Post date: [September 13, 2025, 6:07pm UTC](https://discourse.vtk.org/t/incorrect-viewport-is-zoomed-with-trame-widgets-vtklocal-localview/16035/2 "2025-09-13T18:07:45Z")

</div>

Thanks for bringing that up. I’ve created an issue on the repo [here](https://github.com/Kitware/trame-vtklocal/issues/39).

---

<div class="post-metadata">

### Author: ![jaswantp](https://discourse.vtk.org/user_avatar/discourse.vtk.org/jaswantp/32/10046_2.png) [@jaswantp](https://discourse.vtk.org/u/jaswantp)
#### Post date: [September 14, 2025, 3:15pm UTC](https://discourse.vtk.org/t/incorrect-viewport-is-zoomed-with-trame-widgets-vtklocal-localview/16035/3 "2025-09-14T15:15:26Z")

</div>

@senanokah can you confirm whether your display/browser uses some scaling? You can check this by printing `window.devicePixelRatio` in your developer console of the browser. It will be 1 if there is no scaling and it will be \>1 or \<1 if there is scaling.

---

<div class="post-metadata">

### Author: ![senanokah](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/s/b5ac83/32.png) [@senanokah](https://discourse.vtk.org/u/senanokah)
#### Post date: [September 19, 2025, 11:40am UTC](https://discourse.vtk.org/t/incorrect-viewport-is-zoomed-with-trame-widgets-vtklocal-localview/16035/4 "2025-09-19T11:40:52Z")

</div>

Thank you both for replying so quickly.

I usually run in VS Code inline in an interactive Jupyter kernel. But, opening the running application in Firefox 142.0.1 shows a scaling of 2:

![bilde](https://discourse.vtk.org/uploads/default/original/2X/8/8f382894770235e27ec5e7a13b921b146b499541.png)

---

<div class="post-metadata">

### Author: ![senanokah](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/s/b5ac83/32.png) [@senanokah](https://discourse.vtk.org/u/senanokah)
#### Post date: [September 19, 2025, 11:45am UTC](https://discourse.vtk.org/t/incorrect-viewport-is-zoomed-with-trame-widgets-vtklocal-localview/16035/5 "2025-09-19T11:45:44Z")

</div>

I see that you guys fixed this in VTK v9.5.2, thanks a lot!
