MATLAB Answers

Function inside GUI don't save modifies to "handles"

12 views (last 30 days)
Luca Amerio
Luca Amerio on 28 Mar 2013
Commented: Jan on 26 Oct 2016
Hi everybody, I'm trying to do my first GUI, but I'm having some problems. Excuse me if my question is a bit stupid.
When I call a function (located inside the same .m file of the main code) I'm not able to modify the handles structure from inside the function.
I've done a very easy code to explain it better:
function pushbutton1_Callback(hObject, eventdata, handles)
handles.A=1;
guidata(hObject, handles);
modify_A(hObject, eventdata, handles)
disp(num2str(handles.A))
%%%%%%%%%%%%
function modify_A(hObject, eventdata, handles)
handles.A=100;
guidata(hObject, handles);
How can i do it?
thank you very much.
  2 Comments
Walter Roberson
Walter Roberson on 23 Oct 2016
Jose abel De la Fuente: you are writing the x and y outputs of ginputc to the same output location. The location is going to end up as just the y value.

Sign in to comment.

Accepted Answer

Jan
Jan on 28 Mar 2013
Edited: Jan on 28 Mar 2013
function pushbutton1_Callback(hObject, eventdata, handles)
handles.A = 1;
guidata(hObject, handles); % Store handles
modify_A(hObject, eventdata, handles) % Update handles
handles = guidata(hObject); % Get newest version of handles
disp(num2str(handles.A))
%%%%%%%%%%%%
function modify_A(hObject, eventdata, handles)
handles.A = 100; % modify handles
guidata(hObject, handles); % Store updated handles
Or more direct:
function pushbutton1_Callback(hObject, eventdata, handles)
handles = guidata(hObject); % Do not trust handles from input
handles.A = 1;
handles = modify_A(hObject, eventdata, handles) % Update handles
disp(num2str(handles.A))
%%%%%%%%%%%%
function handles = modify_A(hObject, eventdata, handles)
handles.A = 100; % modify handles
  2 Comments
Jan
Jan on 26 Oct 2016
The "handles" from the input arguments are the version of the struct during the creation of the figure. Therefore later changes of this struct might not be included. If you do not modify this variable or GUIDE updates it, there is no problem. But this migtht depend on the GUIDE version, therefore it is a good idea to get the current version of handles manually.
"handles" is simply a struct here. The name is misleading, because it can contain anything and not only handles. A handle is a kind of unique address for each GUI element.
While "handles = guidata(hObject)" reads the struct from the figure's application data, "guidata(hObject, handles)" writes the struct back. Inside the command guidata thuis happens:
% handles = guidata(hObject)
set(ancestor(hObject, 'figure'), 'ApplicationData', handles);
% guidata(hObject, handles)
handles = get(ancestor(hObject, 'figure'), 'ApplicationData');
For clarity I leave out, that guidata uses a field of the ApplicationData only.

Sign in to comment.

More Answers (1)

Jing
Jing on 28 Mar 2013
That's because you didn't update A after modification! Before disp, you should get A back from the handles by "A=handles.A;".
  3 Comments
Luca Amerio
Luca Amerio on 28 Mar 2013
I repeat: i'm very sorry. I tested the dummy code before posting it, but then i decided to modify it a little bit to make it clearer. I didn't noticed that i forgot to modify that value.
I try to be as clear and precise I can when I ask for help, but sometimes I miss something.
Sorry

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!