МАТЛАБ: Как передавать данные между 2 GUI, используя функцию findobj?

Я новичок в создании графических интерфейсов с Matlab. У меня есть один MainGui, из которого я открываю Subgui, чтобы пользователь мог установить флажки. После нажатия кнопки "ОК" мой Subgui закрывается, и снова появляется MainGui-поверхность.

Как я могу получить доступ к значению clickbutton без использования getappdata и setappdata, а вместо этого сделать это с помощью findobj-function, которая, когда она работает, для меня намного проще.

Так что я в коде MainGui, и я ищу Subgui с

 hGui = findobj('Tag','Subgui');

где 'Subgui' - это значение свойства Tag SubGUI. Видимость ручек включена для обоих!!

    % get control handles for this GUI
    handlesSubgui = guidata(hGui);

    % now read the data from the checkbox
    checkValue = get(handlesSubgui.checkbox1,'Value');

Почему это не работает? Я установил правильные теги и включил видимость, но я получаю

hGui =

     Empty matrix: 0-by-1

!?

У кого-нибудь есть идея? Я был бы рад получить помощь! С наилучшими пожеланиями, Джон

1 ответ

Решение

Один из вариантов для такого случая - инициализация небольшого графического интерфейса внутри вашего обратного вызова кнопки. Чтобы проиллюстрировать это, я настрою небольшой программный графический интерфейс:

function testcode
res = get(0,'ScreenSize');
figdim = [300 300]; % Figure size, pixels

h.mainfig = figure( ...
    'Units', 'Pixels', ...
    'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
    'Name', 'This is the Main GUI', ...
    'Resize', 'off', ...
    'DockControls', 'off', ...
    'NumberTitle', 'off', ...
    'MenuBar', 'none', ...
    'Toolbar', 'none' ...
    );

h.subGUIbutton = uicontrol( ...
    'Parent', h.mainfig, ...
    'Units', 'Normalized', ...
    'Position', [0.25 0.6 0.5 0.3], ...
    'String', 'Open Checkbox GUI' ...
    );

h.displaydatabutton = uicontrol( ...
    'Parent', h.mainfig, ...
    'Units', 'Normalized', ...
    'Position', [0.25 0.1 0.5 0.3], ...
    'String', 'Display Checkbox Selections' ...
    );

% Requires R2014b or newer, otherwise we'll have to use set
try
    h.subGUIbutton.Callback = {@checkboxGUI, h};
    h.displaydatabutton.Callback = {@displaydata, h};
catch
    set(h.subGUIbutton, 'Callback', {@checkboxGUI, h});
    set(h.displaydatabutton, 'Callback', {@displaydata, h});
end

И наши обратные вызовы будут структурированы так:

function checkboxGUI(~, ~, handles)
res = get(0,'ScreenSize');
figdim = [200 200]; % Figure size, pixels
h2.mainfig = figure( ...
    'Units', 'Pixels', ...
    'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
    'Name', 'This is the Sub GUI', ...
    'Resize', 'off', ...
    'DockControls', 'off', ...
    'NumberTitle', 'off', ...
    'MenuBar', 'none', ...
    'Toolbar', 'none' ...
    );

% Build some checkboxes
for ii = 1:4
    h2.checkbox(ii) = uicontrol( ...
        'Parent', h2.mainfig, ...
        'Style', 'checkbox', ...
        'Units', 'Normalized', ...
        'Position', [0.25 (1 - ii*0.15) 0.5 0.1], ...
        'String', sprintf('Checkbox #%u', ii) ...
        );
end

h2.closebutton = uicontrol( ...
    'Parent', h2.mainfig, ...
    'Style', 'pushbutton', ...
    'Units', 'Normalized', ...
    'Position', [0.25 0.15 0.5 0.1], ...
    'String', 'Accept Changes', ...
    'Callback', {@closecheckbox} ...
    );

    function closecheckbox(~, ~)
        % requires R2014b or newer for dot notation
        try
            test = find([h2.checkbox(:).Value]); % Returns ID of checked boxes
        catch
            test = find(cell2mat(get(h2.checkbox(:), 'Value'))'); % Returns ID of checked boxes
        setappdata(handles.mainfig, 'BoxesChecked', test);
        close(h2.mainfig);
    end

waitfor(h2.mainfig); % Wait for user to close the checkbox GUI
end

function displaydata(~, ~, handles)
BoxesChecked = getappdata(handles.mainfig, 'BoxesChecked');

if isempty(BoxesChecked)
    fprintf('No boxes celected\n');
else
    fprintf('User selected box: %d\n', BoxesChecked);
end
end

Обратите внимание, что я использовал вложенную функцию для удобства чтения. В этом простом примере у нас есть две кнопки в нашем основном графическом интерфейсе, кнопка, чтобы открыть приглашение пользователя, а затем кнопка отображения. Когда пользователь открывает приглашение флажка, выполнение всех команд GUI приостанавливается, пока приглашение не будет закрыто. При нажатии кнопки отображения мы получаем проверенные значения из данных приложения и распечатываем их в командном окне.

Другие вопросы по тегам