Function inside GUI don't save modifies to "handles"
    7 views (last 30 days)
  
       Show older comments
    
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
  Jose abel De la Fuente
 on 23 Oct 2016
				
      Edited: Jose abel De la Fuente
 on 23 Oct 2016
  
			Hi.
I have one problem seemed, which does not allow me update the handles.
My problem start when I try using the uipushtool and the ClickedCallback. In the handle function I have tried to update the handle of this way:
 uipushtool(tbh,'CData',imread('Complementos\Verde.png'),'Separator','off',...
                          'TooltipString','Your toggle tool',...
                          'HandleVisibility','off',...
                          'ClickedCallback',...
                              {@marcarPunto,handles, cmP,cnP}); 
function marcarPunto(hObject,event,handles,cmP,cnP) 
     [handles.pnSin(cnP,cmP),handles.pmSin(cnP,cmP)]=ginputc(1, 'Color', 'w');    
     guidata(hObject,handles);
Please I will grateful with someone who could help me.
In my example hanldes has two elements (pnSin and pmSin).
  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.
Accepted Answer
  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
      
      
 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.
More Answers (1)
  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
  Jan
      
      
 on 28 Mar 2013
				Please do not post wrong code and mention this in a comment to an answer. Use the chance to edit the original question, because this would be less confusing for the readers. And when you want the assistence of voluntary helpers, any kind of confusion is a bad idea.
See Also
Categories
				Find more on Function Handles 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!