Why Is Not the Handles Variable Updated?

조회 수: 6 (최근 30일)
Rightia Rollmann
Rightia Rollmann 2017년 3월 17일
답변: Jan 2017년 3월 17일
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
Adam
Adam 2017년 3월 17일
편집: Adam 2017년 3월 17일
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 2017년 3월 17일
+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.

댓글을 달려면 로그인하십시오.

채택된 답변

Walter Roberson
Walter Roberson 2017년 3월 17일
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.

추가 답변 (2개)

ES
ES 2017년 3월 17일
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
Walter Roberson
Walter Roberson 2017년 3월 17일
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 2017년 3월 17일
@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
Jan 2017년 3월 17일
Sharing data between callbacks is a frequently occurring problem. Therefore searching in the forum is most likely useful:

카테고리

Help CenterFile Exchange에서 Environment and Settings에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by