При использовании scikit CollectionViewer (простой браузер изображений) я бы хотел, чтобы нажатие клавиш со стрелками не запускало переход к предыдущему/следующему изображению после того, как слайдер получил фокус. Я использовал eventFilter для этого
from skimage.viewer import ImageViewer
from skimage.viewer.qt import Qt
from skimage.viewer.widgets import Slider
class SilentViewer(ImageViewer): #CollectionViewer with some modifications
def __init__(self, image_collection, update_on='move', **kwargs):
self.image_collection = image_collection
self.index = 0
self.num_images = len(self.image_collection)
first_image = image_collection[0]
super(SilentViewer, self).__init__(first_image)
slider_kws = dict(value=0, low=0, high=self.num_images - 1)
slider_kws['update_on'] = update_on
slider_kws['callback'] = self.update_index
slider_kws['value_type'] = 'int'
self.slider = Slider('frame', **slider_kws)
self.layout.addWidget(self.slider)
self.installEventFilter(self) #Modification to CollectionViewer №1
def update_index(self, name, index):
index = int(round(index))
if index == self.index:
return
index = max(index, 0)
index = min(index, self.num_images - 1)
self.index = index
self.slider.val = index
self.update_image(self.image_collection[index])
def eventFilter(self,obj,evt): #Modification to CollectionViewer №2
try:
print(evt.type(), evt.key(), evt.text())
if (evt.key() == Qt.Key_Left or
evt.key() == Qt.Key_Right or
evt.key() == Qt.Key_Up or
evt.key() == Qt.Key_Down):
print("Ignored arrow button")
return True
else:
return False
except:
print("Smth went wrong")
return False
#for testing reasons
from skimage import data
from skimage.transform import pyramid_gaussian
img = data.coins()
img_pyr = pyramid_gaussian(img, downscale=2, multichannel=False)
img_collection = tuple(img_pyr)
viewer = SilentViewer(img_collection)
viewer.show()
фильтр событий, кажется, работает: нажатия клавиш и другие события вызывают вывод консоли. Однако клавиши со стрелками вызывают смену изображения. Если я перехожу на update_on='release'
(см. инициализацию), клавиши со стрелками не вызывают изменение изображения, а изменяют положение ползунка. Подскажите, пожалуйста, как сделать так, чтобы нажатия стрелок полностью потреблялись фильтром?
update_on='move'
я получаю точно такое же поведение, как и при использовании исходного CollectionViewer. Однако кнопка со стрелкой игнорируется. Клавиши со стрелкамиupdate_on='release'
не вызывают смену изображения (и это нормально), но они влияют на положение ползунка (это не нормально). - person Gryphon   schedule 14.06.2020