Why Is Not the Handles Variable Updated?
6 ビュー (過去 30 日間)
古いコメントを表示
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
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
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
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.
0 件のコメント
その他の回答 (2 件)
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
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
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
2017 年 3 月 17 日
Sharing data between callbacks is a frequently occurring problem. Therefore searching in the forum is most likely useful:
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Environment and Settings についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!