VTK, Mayavi BUG: все «ButtonReleaseEvents» не работают, но все «ButtonPressEvents» работают? - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу захватить mouse release события в виде майяви. В частности, мне нужно щелкнуть объект, повернуть его, а затем получить информацию о выходе мыши.


Попытка:

Стандарт Mayavi on_mouse_pick не может обнаружить такое поведение (см. approach 1 в приведенном ниже коде).

Однако, vtk (на котором построен Mayavi) DOES имеет определенную функцию LeftButtonReleaseEvent(). Это знание было найдено по адресу: https://www.vtk.org/doc/nightly/html/classvtkRenderWindowInteractor.html

Я написал код ниже, который эффективно использует этот онлайн-документ и может вызывать аналогичную функцию из этого списка: LeftButtonPressEvent() (см. approach 2 ниже). В то время как LeftButtonPressEvent() работает, как-то LeftButtonReleaseEvent() не работает (и то же самое для средних, правых кликов).

Я уже несколько дней ломаю себе голову - кто-нибудь понимает, что это за исключением прямой ошибки? Кто-нибудь может проверить на своих компьютерах, чтобы убедиться?

from __future__ import print_function
import numpy as np
from mayavi import mlab
from tvtk.api import tvtk

###################
### mayavi section:

fig1 = mlab.figure(1)
mlab.test_contour3d()
mlab.title('click me')

##############
# approach 1:
#def picker_callback(picker_obj):
    #print('click recieved')   
#fig1.on_mouse_pick(picker_callback)

##############
# approach 2:
def press_callback(vtk_obj, event):
    print('pressed')
def release_callback(vtk_obj, event):
    print('released')

fig1.scene.interactor.add_observer('LeftButtonPressEvent', press_callback) #works
fig1.scene.interactor.add_observer('LeftButtonReleaseEvent', release_callback) #doesn't work

mlab.show()

1 Ответ

0 голосов
/ 10 сентября 2018

Большое спасибо @FelipeLema в комментариях за этот потрясающий ответ! Я объединил его предложение в ранее написанный код для имитации естественных mouse release событий:

from __future__ import print_function
import numpy as np
from mayavi import mlab
from tvtk.api import tvtk

###################
### mayavi section:

fig1 = mlab.figure(1)
mlab.test_contour3d()
mlab.title('click me')

click_on = 0

def press_callback(vtk_obj, event):
    global click_on
    click_on = 1
    print('pressed')

def release_callback(vtk_obj, event):
    global click_on
    if click_on == 1:
        print('released')
        click_on = 0

fig1.scene.interactor.add_observer('LeftButtonPressEvent', press_callback)
#fig1.scene.interactor.add_observer('LeftButtonReleaseEvent', release_callback) #doesn't work
fig1.scene.interactor.add_observer('EndInteractionEvent', release_callback) #solution!! (with above setup)

mlab.show()
...