MATLAB: приостановить программу и ждать нажатия клавиши

Я пишу программу, в которой в какой-то момент строится график и выводится на экран. Затем пользователю необходимо нажать " y " или "n", чтобы принять или отклонить график. Мое текущее решение использует PsychToolbox (фактическое решение не нужно), который включает в себя команду под названием "KbCheck", которая проверяет во время вызова состояние всех кнопок клавиатуры. Мой код выглядит так:

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

проблема в том, что система действительно "зависает", пока не нажата клавиша. В идеале я мог бы прокручивать, масштабировать и вообще взаимодействовать с графиками, которые отображаются на экране, чтобы я мог действительно решить, хочу ли я нажать " y " или "n"!

Я попытался добавить "drawnow;" в цикл while выше, но это не работает: я все еще не могу взаимодействовать с построенными графиками до после Я принял или отверг их.

решение не должно использовать PsychToolbox; я предполагаю, что есть много других вариантов там?

спасибо

6 ответов


Я бы использовать input функция:

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

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

хотя, по общему признанию, для этого требуется два нажатия клавиш (y затем Enter), а не один.


почему бы не использовать ?

документация:http://www.mathworks.fr/help/techdoc/ref/waitforbuttonpress.html


подождите, пока buttonpress откроет фигуру, которая может быть нежелательной. Используйте вместо

pause('on');
pause;

что позволяет пользователю приостанавливать работу до нажатия клавиши.


вы не хотите использовать waitforbuttonpress поскольку он блокирует графический интерфейс (без масштабирования, панорамирования и т. д.).

pause может вызвать окно команды, чтобы украсть фокус с рисунка.

решение, которое я считаю лучшим, - это открыть фигуру с нулевым keyPressFcn, чтобы избежать проблем с фокусом:

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

а затем дождитесь изменения свойства CurrentCharacter:

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

дождитесь нажатия клавиши или нажатия кнопки мыши:

пример:

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

для получения дополнительной информации посетите: http://www.mathworks.com/help/matlab/ref/waitforbuttonpress.html


команда waitforbuttonpress хороша, но запускается либо щелчком мыши, либо нажатием клавиши. Если вы хотите, чтобы он срабатывал только от нажатия клавиши, вы можете использовать следующий хак:

while ~waitforbuttonpress
end