fängt Es gibt eine Reihe von Möglichkeiten, build a GUI, wie die Verwendung des App Designer, GUIDE, oder erstellen Sie es programmgesteuert (ich werde diese Option unten veranschaulichen). Es ist auch wichtig, auf die different ways to define callback functions für Ihre GUI-Komponenten und die options available for sharing data between components zu achten.
Der Ansatz, den ich teilweise bin, verwendet nested functions als Rückrufe. Hier ist eine einfache GUI als Beispiel:
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
Wenn Sie diesen Code ausführen, angezeigt der Zähler um eins jedes Mal, wenn Sie die Taste drücken erhöhen sollte, da die verschachtelte Funktion increment
Zugriff auf den Arbeitsbereich von make_useless_button
hat und kann somit Ändern Sie iCounter
. Beachten Sie, dass der Button Callback auf function handle bis increment
gesetzt ist und dass diese Funktion standardmäßig zwei Argumente akzeptieren muss: ein Grafik-Handle für die UI-Komponente, die den Rückruf ausgelöst hat, und eine Struktur der zugehörigen Ereignisdaten. Wir ignore them with the ~
in diesem Fall, da wir sie nicht verwenden.
den oben beschriebenen Ansatz Ihr Problem erweitern, könnten Sie Ihre Schleife hinzufügen und den Rückruf ändern, so dass es Ihre Flagvariable auf false setzt:
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
Die drawnow
hier benötigt wird, die Taste Rückruf eine Chance zu geben um den Programmablauf innerhalb der Schleife zu unterbrechen und den Wert keepLooping
zu ändern.
OP muss die Ausgabevariable in etwas anderes ändern und "global myvar" im Basisarbeitsbereich erstellen, damit dies funktioniert. – Azim
Ist das wirklich der einzige Weg? Es scheint ziemlich plump zu sein, globale Variablen für den Job zu verwenden. – bastibe
Es ist der beste Weg, auf den ich gekommen bin - ich stimme zu, es ist ein bisschen hässlich, ich denke nicht, dass das Matlab-GUI-Modell sehr gut ist. Vielleicht möchten Sie den Code in dem nützlichen (?) Beitrag in Mathworks überprüfen. Die Website ist im Minutentakt. –