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