Update app designer field in external function

6 visualizzazioni (ultimi 30 giorni)
I'm designing a Matlab app with the app designer. In the app GUI_mirror_cooling I have a 'run' button that executes a simulation script, sim_cooling_GUI. Since the simulation may take a long time, it would be nice to have a progress field. By calling a GUI_mirror_cooling update function periodically, this text field would be updated.
function RunButtonPushed(app, event)
sim_cooling_GUI(app.GUI_settings) % call the simulation function
end
And in sim_cooling_GUI, when current time is a fraction of the end time:
if t/t_end >= disp_update/100
disp(['Progress: ',num2str(t/t_end*100),'%']) % show progress in matlab command window
disp_update = disp_update + 1; % increment, disp_update/100 could also be used as output
update_progress_indicator(GUI_mirror_cooling,round(t/t_end*100),1); % show progress in app, ETA not yet implemented
end
The time step size is nonconstant, therefore I have a >= with disp_update.
Now, in the app GUI_mirror_cooling,
methods (Access = public)
function update_progress_indicator(app,progress,ETA)
app.ProgressEditField.Value = [num2str(progress),'%']; % progress in percent
app.ExpectedendtimeEditField.Value = num2str(ETA); % ETA, to be implemented
pause(0.001) % allow field to be updated
end
end
This however opens a new app window for every 1 % progress (with the correct progress field value). What I need is that the app window that is already open has its value updated. I have seen similar (old) questions that use handles, however I am unsure how to access the fields of the app window.

Risposta accettata

Geoff Hayes
Geoff Hayes il 15 Mag 2020
Koen - it looks like your sim_cooling_GUI is a function (since you are passing in the app.GUI_Settings so why not just pass in the app object as well so that you update its progress rather than creating a new instance of the GUI?
function RunButtonPushed(app, event)
sim_cooling_GUI(app, app.GUI_settings) % call the simulation function
end
and
function sim_cooling_GUI(app, GUI_settings)
% some code
if t/t_end >= disp_update/100
disp(['Progress: ',num2str(t/t_end*100),'%']) % show progress in matlab command window
disp_update = disp_update + 1; % increment, disp_update/100 could also be used as output
update_progress_indicator(app,round(t/t_end*100),1); % show progress in app, ETA not yet implemented
end
So we use the passed in app rather than creating a new instance of the GUI.
  1 Commento
Koen
Koen il 15 Mag 2020
Hello Geoff, thank you for your simple and clear answer. This solves my problem and helps me learn the language!

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Develop Apps Using App Designer in Help Center e File Exchange

Prodotti


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by