6

我正在使用 MATLAB GUI 制作一个简单的实时数据查看器,其中包含播放、暂停和滑块等按钮。用户按下播放滑块后,每一步都需要更新(每秒 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')
4

1 回答 1

1

Enable您可以通过将滑块的属性设置为offinactive按下播放按钮并使用ButtonDownFcn停止播放并设置Enable回的功能来实现中断播放on

使用 atogglebutton作为我的播放按钮(只要您可以将布尔标志保存在可访问的地方,其他控件小部件应该可以工作),我使用以下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});

警告:如果您开始以与此类似的方式添加与滑块/播放按钮交互的其他小部件,则会增加引入竞争条件的机会。

于 2012-04-24T16:27:10.610 回答