MATLAB: приостановить программу и ждать нажатия клавиш - PullRequest
7 голосов
/ 16 февраля 2012

Я пишу программу, в которой в какой-то момент график отображается и отображается на экране. Затем пользователь должен нажать «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 ]

6 голосов
/ 16 февраля 2012

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

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

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

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

5 голосов
/ 23 октября 2013

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

pause('on');
pause;

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

5 голосов
/ 16 февраля 2012

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

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

4 голосов
/ 03 декабря 2013

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

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

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

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

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

waitfor(gcf,'CurrentCharacter');
curChar=uint8(get(gcf,'CurrentCharacter'));
1 голос
/ 22 мая 2014

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

Пример:

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

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

0 голосов
/ 04 сентября 2013

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

while ~waitforbuttonpress
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...