使用回调时更新GUI句柄

时间:2013-12-16 13:55:19

标签: matlab user-interface matlab-guide handles

我有一个由GUIDE制作的GUI,当我在回调中调用回调时,我无法弄清楚如何更新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 个答案:

答案 0 :(得分:3)

在任何句柄修改功能之后,你必须再次加载句柄:

% 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