Обновление дескрипторов GUI при использовании обратного вызова

У меня есть GUI, сделанный из GUIDE, и я не могу понять, как обновить дескриптор GUI, когда я вызываю обратный вызов в обратном вызове. Так, например, в функции, которая вызывает функцию, все, что у меня есть, это следующее:

function start_ss_Callback(hObject, eventdata, handles)
% hObject    handle to start_ss (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of start_ss as text
%        str2double(get(hObject,'String')) returns contents of start_ss as a double
start_hh_Callback(hObject, eventdata, handles)

И в start_hh_Callback У меня есть код, приведенный ниже, но мой handles.plot_holds не обновляется независимо от того, что у меня есть guidata(hObject, handles), Это потому что я использую это как функцию? Если я просто пройду через start_hh_Callback сам не через start_ss_Callback, это обновляет. Однако, если я использую его в обратном вызове, как start_ss_Callback это не обновляет.

Я надеюсь, что мой вопрос ясен, дайте мне знать, если вам нужны разъяснения.

function start_hh_Callback(hObject, eventdata, handles)
% hObject    handle to start_hh (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of start_hh as text
%        str2double(get(hObject,'String')) returns contents of start_hh as a double

axes(handles.axes1)
if isempty(handles.plot_holds)
    cla
    plot_button_Callback(hObject, eventdata, handles)
else
    % in the event the time is changed after more than 1 plot is held then
    % the additional plot times will be re evaluated for each parameter and
    % the new indicies will take into affect.
    myParams = get(handles.load_params_button,'string');
    mystartDD = str2num(get(handles.start_dd,'string'));
    mystartHH = str2num(get(handles.start_hh,'string'));
    mystartMM = str2num(get(handles.start_mm,'string'));
    mystartSS = str2num(get(handles.start_ss,'string'));

    myendDD = str2num(get(handles.end_dd,'string'));
    myendHH = str2num(get(handles.end_hh,'string'));
    myendMM = str2num(get(handles.end_mm,'string'));
    myendSS = str2num(get(handles.end_ss,'string'));

    startFromStart =  (mystartDD)*60*60*24 + (mystartHH-handles.startHour)*60*60 ...
        + (mystartMM-handles.startMinute)*60 + (mystartSS-handles.startSecond);
    endFromStart =  (myendDD)*60*60*24 + (myendHH-handles.startHour)*60*60 ...
        + (myendMM-handles.startMinute)*60 + (myendSS-handles.startSecond);

    iStart = find(handles.load.dataGST.(handles.myParams{handles.plot_holds(1,1)}).(handles.myPackets{handles.plot_holds(1,1)}{handles.plot_holds(1,2)}).Time > (startFromStart+handles.startTimeOffset),1);
    iEnd = find(handles.load.dataGST.(handles.myParams{handles.plot_holds(1,1)}).(handles.myPackets{handles.plot_holds(1,1)}{handles.plot_holds(1,2)}).Time > (endFromStart+handles.startTimeOffset),1);
    if isempty(iEnd)
        iEnd = length(handles.load.dataGST.(handles.myParams{handles.plot_holds(1,1)}).(handles.myPackets{handles.plot_holds(1,1)}{handles.plot_holds(1,2)}).Time);
    end

    cla
    hold off

    plot(handles.load.dataGST.(handles.myParams{handles.plot_holds(1,1)}).(handles.myPackets{handles.plot_holds(1,1)}{handles.plot_holds(1,2)}).Time(iStart:iEnd),...
        handles.load.dataGST.(handles.myParams{handles.plot_holds(1,1)}).(handles.myPackets{handles.plot_holds(1,1)}{handles.plot_holds(1,2)}).Data(iStart:iEnd))

    grid minor
    box on

    handles.plot_holds(1,3) = iStart;
    handles.plot_holds(1,4) = iEnd;

    if size(handles.plot_holds,1)>1
        hold all
        for ii = 2:size(handles.plot_holds)
            iStart = find(handles.load.dataGST.(handles.myParams{handles.plot_holds(ii,1)}).(handles.myPackets{handles.plot_holds(ii,1)}{handles.plot_holds(ii,2)}).Time > (startFromStart+handles.startTimeOffset),1);
            iEnd = find(handles.load.dataGST.(handles.myParams{handles.plot_holds(ii,1)}).(handles.myPackets{handles.plot_holds(ii,1)}{handles.plot_holds(ii,2)}).Time > (endFromStart+handles.startTimeOffset),1);
            if isempty(iEnd)
                iEnd = length(handles.load.dataGST.(handles.myParams{handles.plot_holds(ii,1)}).(handles.myPackets{handles.plot_holds(ii,1)}{handles.plot_holds(ii,2)}).Time);
            end
            plot(handles.load.dataGST.(handles.myParams{handles.plot_holds(ii,1)}).(handles.myPackets{handles.plot_holds(ii,1)}{handles.plot_holds(ii,2)}).Time(iStart:iEnd),...
                handles.load.dataGST.(handles.myParams{handles.plot_holds(ii,1)}).(handles.myPackets{handles.plot_holds(ii,1)}{handles.plot_holds(ii,2)}).Data(iStart:iEnd))
            handles.plot_holds(ii,3) = iStart;
            handles.plot_holds(ii,4) = iEnd;
        end
    end
end

legend(handles.myLegends{1:length(handles.myLegends)})

guidata(hObject, handles);

1 ответ

Решение

Вам придется снова загружать дескрипторы после любой функции, модифицирующей дескрипторы:

% this modifies and writes the handles to the guidata
start_hh_Callback(hObject, eventdata, handles);
% now read back the updated value
handles = guidata(hObject);

В качестве альтернативы вы могли бы также сделать handles возвращаемое значение вашего обратного вызова. Обычно это будет игнорироваться, когда оно действительно используется в качестве обратного вызова, а при использовании в качестве "нормальной" функции избегает необходимости повторного чтения из guidata, Ваш код может выглядеть так:

handles = start_hh_Callback(hObject, eventdata, handles);

с вашим обратным вызовом, переопределенным в:

function [handles] = start_hh_Callback(hObject, eventdata, handles)
...
end
Другие вопросы по тегам