【问题标题】:MATLAB: Pause program and await keypressMATLAB:暂停程序并等待按键
【发布时间】:2012-02-16 11:50:39
【问题描述】:

我正在编写一个程序,在该程序中,有时会在屏幕上绘制并显示图形。然后用户需要按“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;我想还有很多其他的选择吗?

谢谢

【问题讨论】:

  • keyboard 命令可用于停止执行。
  • 这将是一个合适的解决方法,但我更愿意让它对用户更友好;即使用“键盘”,要接受图表,我必须输入“变量名称 = 'y'; return;”
  • 使用“输入”功能,您只需要输入 y 或 n,但它确实要求您按 Enter。

标签: matlab keypress


【解决方案1】:

我会使用input 函数:

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

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

虽然不可否认,它需要两个按键(y 然后 Enter)而不是一个。

【讨论】:

  • 我会满足于两次按键!非常感谢
【解决方案2】:

等待按钮按下会打开一个图形,这可能是不需要的。改为使用

pause('on');
pause;

让用户暂停直到按下某个键。

【讨论】:

    【解决方案3】:

    为什么不改用waitforbuttonpress

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

    【讨论】:

    • 这个解决方案的优点是焦点自动在窗口上。所以没有必要点击命令窗口。如果您使用“暂停”,这是必要的。该函数引发的窗口可以自动关闭,代码如下:figure(42); waitforbuttonpress; close(figure(42));
    • @Ergodicity 感谢您在评论中指出这一点。我想 clumsy 有点远,并从答案中删除了这个。但是,如果不想打开图形,例如使用命令窗口中弹出的矩阵,我仍然会暂停:但如果想要逐步停止图形以检查更改,我会说 @ 987654324@ 是个好命令。
    【解决方案4】:

    您不想使用waitforbuttonpress,因为它会锁定图形 gui(无法缩放、平移等)。

    pause 会导致命令窗口从图中窃取焦点。

    我发现效果最好的解决方案是使用 null keyPressFcn 打开图形以避免焦点问题:

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

    然后等待 CurrentCharacter 属性改变:

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

    【讨论】:

      【解决方案5】:

      等待按键或鼠标点击:

      例子:

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

      欲了解更多信息,请访问: http://www.mathworks.com/help/matlab/ref/waitforbuttonpress.html

      【讨论】:

        【解决方案6】:

        waitforbuttonpress 命令很好,但可以通过鼠标单击或按键触发。如果您希望它仅通过按键触发,您可以使用以下 hack:

        while ~waitforbuttonpress
        end
        

        【讨论】:

        猜你喜欢
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        相关资源
        最近更新 更多