question about togglebutton in gui

1 view (last 30 days)
alex
alex on 31 Oct 2014
Commented: Geoff Hayes on 3 Nov 2014
Hello!
i have created a gui and i have a togglebutton in it.
the code in the while loop in the togglebutton works fine.
while get(hObject,'Value')
/* code */
end
1
My problem is that the code outside the while loop is not executed. for the above example,when i press the togglebutton the code works fine and when i release it the '1' is not appeared.
Any idea?
thank you very much

Accepted Answer

Geoff Hayes
Geoff Hayes on 31 Oct 2014
Alex - without knowing the contents of your code (in the while loop) I can only hypothesize that the problem may be that the code is not giving any other callback a chance to interrupt this one. While the interruptible property of this toggle (see this in the Property Inspector) may be on, it will only be interrupted if the function calls drawnow, figure, getframe, pause, or waitfor at each iteration of the while loop.
Try the following
function togglebutton1_Callback(hObject, eventdata, handles)
while get(hObject,'Value')
% do stuff
end
fprintf('exiting while loop!\n');
If I run my GUI, and press the toggle button, then the code is stuck in the while loop even though I depress the toggle and so I have to ctrl+c to cancel the operation.
In order to allow the function to be interrupted, I could change the above to include a pause or drawnow at each iteration (the latter may be inappropriate if you are not drawing anything)
function togglebutton1_Callback(hObject, eventdata, handles)
while get(hObject,'Value')
% do stuff
pause(0.001); % or drawnow
end
fprintf('exiting while loop!\n');
Now, when you run your GUI and press the toggle, once you depress it, the while loop will exit and you will see
exiting while loop!
exiting while loop!
written twice to the Command Window. It is written once for the original callback that becomes interrupted, and a second time because you have invoked the callback by depressing the toggle button. This could have negative side effects if you have some code that follows the while loop which you only want to be invoked if the code has just exited the while loop. You could guard against this sort of thing by only running the code in the callback if the toggle is pressed
function togglebutton1_Callback(hObject, eventdata, handles)
if get(hObject,'Value')
while get(hObject,'Value')
% do stuff
pause(0.001);
end
fprintf('exiting while loop!\n');
end
and you will only see the message written once to the Command Window.
An alternative approach (which I typically use) is to create a timer - when the user presses the toggle button, start the periodic timer that will repeatedly call the code that you would have had in your while loop. And when the user depresses the toggle button, stop the periodic timer. This may not be applicable/possible for your code though (it all depends on what is happening in the loop).
  4 Comments
alex
alex on 3 Nov 2014
yes that's the answer! i raise the pen when i stop drawing,so the code enters the second if statemenet!thanks again!

Sign in to comment.

More Answers (0)

Categories

Find more on Interactive Control and Callbacks 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!