Why Is Not the Handles Variable Updated?

16 Ansichten (letzte 30 Tage)
Rightia Rollmann
Rightia Rollmann am 17 Mär. 2017
Beantwortet: Jan am 17 Mär. 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 Kommentare
Adam
Adam am 17 Mär. 2017
Bearbeitet: Adam am 17 Mär. 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
Jan am 17 Mär. 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.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 17 Mär. 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.

Weitere Antworten (2)

ES
ES am 17 Mär. 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 Kommentare
Walter Roberson
Walter Roberson am 17 Mär. 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
Jan am 17 Mär. 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.

Melden Sie sich an, um zu kommentieren.


Jan
Jan am 17 Mär. 2017
Sharing data between callbacks is a frequently occurring problem. Therefore searching in the forum is most likely useful:

Kategorien

Mehr zu Interactive Control and Callbacks finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by