Hay varias formas de build a GUI, como usar el Diseñador de aplicaciones, GUÍA o crearlo programáticamente (Ilustraré esta opción a continuación). También es importante conocer el different ways to define callback functions para los componentes de su GUI y el options available for sharing data between components.
El enfoque que me gusta es utilizar nested functions como devoluciones de llamada. Aquí hay una interfaz gráfica de usuario simple como un ejemplo:
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
Cuando se ejecuta este código, el contador que aparece debería incrementarse en uno cada vez que se pulsa el botón, ya que la función anidada increment
tiene acceso al espacio de trabajo de make_useless_button
y por lo tanto puede modificar iCounter
. Tenga en cuenta que la devolución de llamada del botón está configurada en function handle a increment
, y que esta función debe aceptar dos argumentos de forma predeterminada: un controlador de gráficos para el componente UI que desencadenó la devolución de llamada y una estructura de datos de eventos asociados. Nos ignore them with the ~
en este caso, ya que no los estamos utilizando.
La ampliación del enfoque anterior a su problema particular, se puede inscribir su bucle y cambiar la devolución de llamada por lo que establece la variable de la bandera a falso:
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
El drawnow
se necesita aquí para darle al botón de devolución de llamada de la oportunidad para interrumpir el flujo del programa dentro del ciclo y modificar el valor de keepLooping
.
OP tendrá que cambiar la variable de salida a otra cosa y crear "myvar global" en el espacio de trabajo base para que esto funcione. – Azim
¿Es esta la única manera? Parece ser un poco contundente usar variales globales para el trabajo. – bastibe
Es la mejor manera que he encontrado, estoy de acuerdo que es un poco feo, no creo que el modelo de Matlab GUI sea muy bueno. Es posible que desee comprobar el código en la contribución útil (?) En Mathworks. El sitio está caído en el minuto. –