Buttondownfcn не работает на слайдере - PullRequest
6 голосов
/ 02 марта 2012

Я создаю простое средство просмотра данных в реальном времени с кнопками, такими как воспроизведение, пауза и слайдер, используя графический интерфейс MATLAB. После того, как пользователь нажимает, ползунок воспроизведения необходимо обновлять каждый шаг (50 выборок в секунду). Эта функциональность мешает перемещению слайдера вручную (вам нужно переместить его в 1/50 секунды). На данный момент я установил обновление ползунка каждые 50 раз (так, раз в секунду), и он работает нормально, если вы не удержите ползунок дольше, чем требуется для обновления.

Проблема в том, что если свойство слайдера Enable включено, Buttondownfcn не работает для левого клика (это работает для правого). Используя Buttondownfcn, я смогу заблокировать обновление и полностью решить проблему. Есть ли способ обойти это?

% --- Executes on slider movement.
function slider_Callback(hObject, eventdata, handles)
disp('Slider movement')

% --- Executes on button down.
function slider_ButtonDownFcn(hObject, eventdata, handles)
disp('Button down')

1 Ответ

1 голос
/ 24 апреля 2012

Вы можете добиться прерывания воспроизведения, установив свойство Enable вашего слайдера на off или inactive, когда вы нажимаете кнопку воспроизведения, и с помощью функции ButtonDownFcn, которая останавливает воспроизведение и устанавливает Enable обратно на on.

Используя togglebutton в качестве моей кнопки воспроизведения (другие виджеты управления должны работать до тех пор, пока вы можете сохранить логический флаг в доступном месте), я использовал следующее как Callback для кнопки:

function playcallback(toggle_button, ~, slider_)
set(slider_, 'Enable', 'inactive'); %slider is disabled
while get(toggle_button, 'Value') %Value is used as flag for playing
    current_value = get(slider_, 'Value');
    set(slider_, 'Value', rem(current_value + 0.01, 1)); %shift slider (looping)
    pause(1/50);
end
set(slider_, 'Enable', 'on'); %done playing, turn slider back on
end

И следующее как ButtonDownFcn для слайдера:

function stopslide(~, ~, toggle_button)
%play flag off: in playcallback, the while loop stops,
%the slider is enabled and the playcallback function returns
set(toggle_button, 'Value', 0); 
end

Вы можете зарегистрировать эти обратные вызовы следующим образом:

set(toggle_button_handle, 'Callback', {@playcallback, slider_handle});
set(slider_handle, 'ButtonDownFcn', {@stopslide, toggle_button_handle});

Предупреждение: если вы начинаетедобавив другие виджеты, взаимодействующие с ползунком / кнопкой воспроизведения аналогичным образом, вы увеличите свои шансы на ознакомление с условиями гонки.

...