Существует несколько способов использования build a GUI, например, с помощью App Designer, GUIDE или его программного программирования (я проиллюстрирую этот вариант ниже). Также важно знать different ways to define callback functions для ваших компонентов графического интерфейса пользователя и options available for sharing data between components.
Подход, в котором я неполный, использует nested functions в качестве обратных вызовов. Вот простой графический интерфейс в качестве примера:
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
. Обратите внимание, что обратный вызов кнопки установлен на function handle на increment
и что эта функция должна принимать по два аргумента по умолчанию: графический дескриптор для компонента пользовательского интерфейса, который вызвал обратный вызов, и структуру связанных данных события. Мы ignore them with the ~
в этом случае, так как мы их не используем.
Расширение выше подход к вашей проблеме, вы можете добавить свой цикл и изменить функцию обратного вызова, так что устанавливает переменную флаг ложь:
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
здесь требуется, чтобы дать кнопку CallBack шанс для прерывания потока программы в цикле и изменения значения keepLooping
.
OP необходимо будет изменить выходную переменную на что-то еще и создать «глобальный myvar» в базовом рабочем пространстве, чтобы это работало. – Azim 2008-11-07 17:29:26
Действительно ли это единственный способ? Кажется, что это грубо использовать глобальные переменные для работы. – bastibe 2008-11-08 08:55:55