Существует несколько способов построить графический интерфейс пользователя , например, с помощью App Designer, GUIDE или создать его программно (я проиллюстрирую эту опцию ниже). Также важно знать о различных способах определения функций обратного вызова для ваших компонентов GUI и опциях , доступных для обмена данными между компонентами .
Подход, к которому я неравнодушен, заключается в использовании вложенных функций в качестве обратных вызовов. Вот простой графический интерфейс в качестве примера:
function make_useless_button()
% Initialize variables and graphics:
iCounter = 0;
hFigure = figure;
hButton = uicontrol('Style', 'pushbutton', 'Parent', hFigure, ...
'String', 'Blah', 'Callback', @increment);
% Nested callback function:
function increment(~, ~)
iCounter = iCounter+1;
disp(iCounter);
end
end
Когда вы запускаете этот код, отображаемый счетчик должен увеличиваться на единицу при каждом нажатии кнопки, потому что вложенная функция increment
имеет доступ к рабочему пространству make_useless_button
и, таким образом, может изменять iCounter
. Обратите внимание, что для функции обратного вызова кнопки задан дескриптор функции - increment
, и что эта функция по умолчанию должна принимать два аргумента: графический дескриптор для компонента пользовательского интерфейса, который вызвал обратный вызов, и структуру связанных данные события. В этом случае мы игнорируем их с помощью ~
, поскольку мы их не используем.
Расширяя вышеуказанный подход к вашей конкретной проблеме, вы можете добавить свой цикл и изменить обратный вызов, чтобы он установил для вашей переменной-флага значение false:
function make_stop_button()
% Initialize variables and graphics:
keepLooping = true;
hFigure = figure;
hButton = uicontrol('Style', 'pushbutton', 'Parent', hFigure, ...
'String', 'Stop', 'Callback', @stop_fcn);
% Keep looping until the button is pressed:
while keepLooping,
drawnow;
end
% Delete the figure:
delete(hFigure);
% Nested callback function:
function stop_fcn(~, ~)
keepLooping = false;
end
end
Здесь необходимо drawnow
, чтобы дать возможность обратному вызову кнопки прервать выполнение программы в цикле и изменить значение keepLooping
.