CaptainProg
CaptainProg

Reputation: 5690

MATLAB: Pause program and await keypress

I am writing a program in which at some point a graph is plotted and displayed on screen. The user then needs to press 'y' or 'n' to accept or reject the graph. My current solution uses the PsychToolbox (the actual solution doesn't need to), which includes a command called 'KbCheck' which checks at the time of calling the state of all the keyboard buttons. My code looks like this:

function [keyPressed] = waitForYesNoKeypress
keyPressed = 0; % set this to zero until we receive a sensible keypress
while keyPressed == 0 % hang the system until a response is given
    [ keyIsDown, seconds, keyCode ] = KbCheck; % check for keypress
    if find(keyCode) == 89 | find(keyCode) == 78 % 89 = 'y', 78 = 'n'
        keyPressed = find(keyCode);
    end
end

The problem is, that the system really does 'hang' until a key is pressed. Ideally, I would be able to scroll, zoom, and generally interact with the graphs that are plotted onscreen so that I can really decide whether or not I want to press 'y' or 'n'!

I have tried adding 'drawnow;' into the while loop above but that doesn't work: I still am unable to interact with the plotted graphs until after I've accepted or rejected them.

The solution doesn't have to use PsychToolbox; I assume there are plenty of other options out there?

Thanks

Upvotes: 7

Views: 38133

Answers (6)

user3041840
user3041840

Reputation: 422

Wait for key press or mouse-button click:

Example:

w = waitforbuttonpress;
if w == 0
    disp('Button click')
else
    disp('Key press')
end

for more information visit: http://www.mathworks.com/help/matlab/ref/waitforbuttonpress.html

Upvotes: 1

patrik
patrik

Reputation: 4558

Wait for buttonpress opens up a figure, which may be unwanted. Use instead

pause('on');
pause;

which lets the user pause until a key is pressed.

Upvotes: 6

Trisoloriansunscreen
Trisoloriansunscreen

Reputation: 1633

You don't want to use waitforbuttonpress since it locks the figure gui (no zooming, panning etc).

pause can cause the command window to steal the focus from the figure.

The solution I find to work best is to open the figure with a null keyPressFcn in order to avoid focus problems:

figure('KeyPressFcn',@(obj,evt) 0);

and then wait for CurrentCharacter property change:

waitfor(gcf,'CurrentCharacter');
curChar=uint8(get(gcf,'CurrentCharacter'));

Upvotes: 4

user1988213
user1988213

Reputation: 1

The waitforbuttonpress command is good but is triggered by either a mouse click or a key press. If you want it to trigger only from a key press, you can use the following hack:

while ~waitforbuttonpress
end

Upvotes: -1

Chris Taylor
Chris Taylor

Reputation: 47382

I'd use the input function:

a = input('Accept this graph (y/n)? ','s')

if strcmpi(a,'y')
    ...
else
    ...
end

Although admittedly it requires two keypresses (y then Enter) rather the one.

Upvotes: 6

Oli
Oli

Reputation: 16035

Why not using waitforbuttonpress instead?

Documentation: http://www.mathworks.fr/help/techdoc/ref/waitforbuttonpress.html

Upvotes: 5

Related Questions