# vtkMRMLSliceNode observe events

**URL:** https://discourse.slicer.org/t/vtkmrmlslicenode-observe-events/3480
**Category:** Development
**Created:** [July 13, 2018, 3:55pm UTC](https://discourse.slicer.org/t/vtkmrmlslicenode-observe-events/3480 "2018-07-13T15:55:35Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![priya.vada4](https://avatars.discourse-cdn.com/v4/letter/p/d26b3c/32.png) [@priya.vada4](https://discourse.slicer.org/u/priya.vada4)
#### Post date: [July 13, 2018, 3:55pm UTC](https://discourse.slicer.org/t/vtkmrmlslicenode-observe-events/3480/1 "2018-07-13T15:55:35Z")

</div>

Hi

I would like to implement custom functionality based on user clicks/keypress in the slice views. I would like to observe the events separately for clicks/keypress in the red and yellow slices. For this, I was implementing the following code. However, the function does not seem to be called when I press the left mouse button or press a key. Could you please let me know the reason. Is there a better way to independently detect key press events on the red and yellow slices?

```
def testMethod(caller, event):
  print("Event detected")

color = "Red"
sliceNode = slicer.mrmlScene.GetNodeByID("vtkMRMLSliceNode%s" % color)
sliceNode.AddObserver(vtk.vtkCommand.LeftButtonPressEvent, testMethod)
sliceNode.AddObserver(vtk.vtkCommand.KeyPressEvent, testMethod)
sliceNode.AddObserver(vtk.vtkCommand.ModifiedEvent, testMethod)

```

Thanks  
Priya

---

<div class="post-metadata">

### Author: ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)
#### Post date: [July 13, 2018, 5:52pm UTC](https://discourse.slicer.org/t/vtkmrmlslicenode-observe-events/3480/2 "2018-07-13T17:52:24Z")

</div>

It is better to avoid this kind of low-level access and use widgets (markups, ROI, etc.), segment editor effects, etc. What would you like to achieve (define input points, move objects, …)?

If you want to process these internal events anyway then you need to observe events of the interactor:

```
interactor = slicer.app.layoutManager().sliceWidget('Red').sliceView().interactor()

def processEvent(caller=None, event=None):
  print(event)
  if event == "KeyPressEvent":
    key = interactor.GetKeySym()
    if key.lower() == 'backslash':
      xy = interactor.GetEventPosition()
      print(xy)
  return False

interactorObserverTags = []
events = ( vtk.vtkCommand.LeftButtonPressEvent,
  vtk.vtkCommand.LeftButtonReleaseEvent,
  vtk.vtkCommand.MiddleButtonPressEvent,
  vtk.vtkCommand.MiddleButtonReleaseEvent,
  vtk.vtkCommand.RightButtonPressEvent,
  vtk.vtkCommand.RightButtonReleaseEvent,
  vtk.vtkCommand.MouseMoveEvent,
  vtk.vtkCommand.KeyPressEvent,
  vtk.vtkCommand.EnterEvent,
  vtk.vtkCommand.LeaveEvent )
for e in events:
  tag = interactor.AddObserver(e, processEvent, 1.0)
  interactorObserverTags.append(tag)
```

---

<div class="post-metadata">

### Author: ![priya.vada4](https://avatars.discourse-cdn.com/v4/letter/p/d26b3c/32.png) [@priya.vada4](https://discourse.slicer.org/u/priya.vada4)
#### Post date: [July 13, 2018, 6:10pm UTC](https://discourse.slicer.org/t/vtkmrmlslicenode-observe-events/3480/3 "2018-07-13T18:10:16Z")

</div>

Thanks very much, Andras. This works well.

Priya
