Why Is Not the Handles Variable Updated?
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Rightia Rollmann
le 17 Mar 2017
Réponse apportée : Jan
le 17 Mar 2017
I have made a simple GUI in GUIDE. I update field A by function myfun1 to the value 20, but I still get 1 in the Command Window! Why hasn’t handles variable been updated? What is the solution? I’d appreciate it if you explain it elaborately
function pushbutton1_Callback(hObject, eventdata, handles)
handles.A = 1;
guidata(hObject, handles);
myfun1(hObject, eventdata, handles)
disp(handles.A)
function myfun1(hObject, eventdata, handles)
handles.A = 20;
guidata(hObject, handles);
2 commentaires
Adam
le 17 Mar 2017
Modifié(e) : Adam
le 17 Mar 2017
In many senses 'handles' is a very unfortunate name for this structure. Less so if you have never done any OOP and are not familiar with handle-derived classes, but still can be confusing when people refer to handles to graphic objects also.
Walter's answer describes this largely, but just to add a little: 'handles' in a GUIDE GUI is literally just a struct, nothing more. It gets passed around to callbacks in a non-transparent way that makes it look like some kind of more magic object, but it is just a struct and works as any other struct.
Graphics objects (including any components in your GUI such as pushbuttons) use handle class semantics - i.e. they copy by reference like any class that derives from the 'handle' base class, but this should not be confused with the 'handles' struct.
So if you are updating a property of e.g. a pushbutton in a function then you do not need to return handles and reassign it - the change will happen automatically, e.g.
handles.pushbutton1.String = 'Some String';
does not require you to do anything more, but
handles.A = 20;
does, as discussed in the answers below.
Jan
le 17 Mar 2017
+1. I've voted for this thread. The question is clear and it is a common problem. The different answers and comments focus on different viewpoints and complement each other. I made a typo in my marginal note, and Walter has clarified it. This is the kind of cooperative teamwork I like in this forum. If a reader has a problem with the updates of the "handles" struct, reading this thread will help.
Thanks, Adam, Chocolate, Rightia and Walter.
Sorry, this comment might look off-topic. I think that positive feedback is more satisfying than complains in case or problems.
Réponse acceptée
Walter Roberson
le 17 Mar 2017
Each routine has its own local copy of the handles structure that (normally) is copied in from the master copy of the handles structure when the routine starts executing. When guidata is called with two inputs the master copy of the handles structure is updated, but no local copy is updated. The handles structure is not a global variable: it is more like "go take a photocopy of the current master and bring back the copy" together with "go file this as the master" -- the photocopies that already exist do not get updated.
If you are in a callback with a copy of the handles structure and you have reason to suspect that the master might have been updated after you got your copy, then if you want to know what the master says now you need to guidata with one input to fetch a new copy of the current master.
0 commentaires
Plus de réponses (2)
ES
le 17 Mar 2017
Your code should work.
Alternatively you can make myfun1 to return handles instead of using guidata to update handles.
function pushbutton1_Callback(hObject, eventdata, handles)
handles.A = 1;
guidata(hObject, handles);
handles = myfun1(hObject, eventdata, handles)
disp(handles.A)
function handles = myfun1(hObject, eventdata, handles)
handles.A = 20;
4 commentaires
Walter Roberson
le 17 Mar 2017
Jan, your code returns handles from myfun1 but does not assign it back to handles, so at the time of the disp() you are going to be using the unmodified version as if the call had not been made.
Chocolate Warrior's code does assign back but misses the guidata.
But my line about the code not working was intended to refer to where Chocolate Warrior said that Rightia's code should work.
Jan
le 17 Mar 2017
@Walter: Thanks for the clarification and finding the bug in my code. See [EDITED]: I had copied Rightia's code accidently, but Chocolate's code contained the required "handles=". Now I understand what "does not work" was related to.
Jan
le 17 Mar 2017
Sharing data between callbacks is a frequently occurring problem. Therefore searching in the forum is most likely useful:
0 commentaires
Voir également
Catégories
En savoir plus sur Environment and Settings dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!