Call OpeningFcn each time a button is pressed
Show older comments
Hi,
I have a piece of main code in which I call a GUI. In the GUI, the OpeningFcn function contains some code and calls uiwait:
handles.output = hObject;
% Set handles fields with initial values from UIcontrols
handles.speedrange = str2double(get(handles.editSpeedRange,'String'));
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes pitch_bounce_input_gui wait for user response (see UIRESUME)
uiwait(handles.bounce_pitch_fig);
The user can change a series of edit box values, which are all captured in the handles structure. When ready, a Run button is pressed that contains the uiresume line:
function pushRun_Callback(hObject, eventdata, handles)
% hObject handle to pushRun (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% resume code
uiresume(gcbf);
This executes the code in OutputFcn, which is some variable storage and manipulation, and returns to the main code. The main code runs a Simulink model in a loop, calculating a set of metrics from each run, and then produces a series of plots.
I would then like the user to have the option to press the Run button again, perhaps having adjusted some of the edit box values. However, the callback for the Run button just contains the uiresume command, which is now not paired to a uiwait. How do I call the OpeningFcn function again when the GUI has remained open (as I would like it to be)?
I haven't found reference to this problem anywhere so I'm concerned that it is less about finding the right code than correctly structuring it in the first place.
Thanks,
Simon.
3 Comments
Rik
on 23 Oct 2018
Why not have you OpeningFcn initialize the GUI like it is supposed to do, and then have it call another function that pauses your GUI. Then you can have other functions/callbacks call your pausing function without having to run the rest of you OpeningFcn.
It also looks to me like this method is a bit vulnerable. Usually it is better to have getappdata and setappdata store the state (running or paused), and check that state every iteration of your loop. Then your buttons can modify that flag. Using guidata would also work, but you'll have to be careful with loading/overwriting the contents of the struct.
Simon Aldworth
on 23 Oct 2018
Guillaume
on 23 Oct 2018
I've not particularly tried to understand the problem here as I'm a bit short of time however my initial reaction on reading the question title was: don't do this.
The OpeningFcn is the function that is run when the figure is opened. Anybody reading the code will understand that it is its purpose. They will not expect that the function is going to run again just for a button press.
It is perfectly fine for the OpeningFcn and the button callback to both call the same function that will perform the same task on figure opening and button press but that common function shouldn't be call OpeningFcn. Don't surprise your reader.
Accepted Answer
More Answers (0)
Categories
Find more on Programming in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!