【问题标题】:Matlab imrect in infinite loopMatlab在无限循环中不正确
【发布时间】:2017-03-29 20:28:13
【问题描述】:

我有一个 Matlab 用户界面,我希望用户在选择单选按钮后使用imrect 输入多个区域。
未知将选择多少个区域,因此选择需要处于无限循环中。
一旦选择另一个单选按钮,imrect 输入应该停止,我无法开始工作。

这是一个最小的工作示例:

function mwe
ax = axes('Position', [0 0 1 1]);
bg = uibuttongroup('Position',[0 0 .15 1], 'SelectionChangedFcn',{@bselection, ax});
r1 = uicontrol(bg, 'Style','radiobutton', 'String','Option 1', 'Position',[10 250 100 30]);
r2 = uicontrol(bg, 'Style','radiobutton', 'String','Option 2', 'Position',[10 225 100 30], 'Value',1);

function bselection(source, event, ax)
  switch event.NewValue.String
    case 'Option 1'
      while true
        h = imrect(ax);
        % do stuff
        delete(h);
      end
    case 'Option 2'
      % do not show imrect and do other stuff
  end

感谢您的帮助。

【问题讨论】:

    标签: matlab user-interface radio-button infinite-loop


    【解决方案1】:

    您可以在按钮上设置Interruptible property。您还可以将BusyAction 设置为cancel。帮助说:

    中断发生在 MATLAB 处理 queue,比如有drawow,uifigure,getframe,waitfor的时候, 或暂停命令。

    因此,如果您包含“暂停”,则在选择下一个矩形之前它可能不会停止。这是因为一旦你调用了imrect,它可能不知道它必须停止。

    但是,如果 imrect 阻止 matlab UI 触发回调,则此方法可能不起作用。

    更好的方法是使用无限循环。您需要通过检查来告诉它何时结束 --

    running = true;
    while running
      h=imrect(ax)
      % do stuff
      delete(h)
      if (SOMETHING)
          running = false
      end
    end
    

    什么是东西?我们需要检查按钮是否被取消选择。

    你可以使用

    if r1.Value!=1
      running = false
    end
    

    这会检查 r1 是否未被选中,如果是,running 变为 false,并且循环停止循环。

    【讨论】:

    • 非常感谢您的帮助!您的解决方案效果很好。我找到了一种检查单选按钮选择的简短方法,方法是将while true 替换为while strcmp(source.SelectedObject.String, 'Option 1')。唯一的问题是,在更改单选按钮选择后,imrect 仍将最后一次执行。为了解决这个问题,我使用了一种解决方法,即在选择选项 2 时模拟按下退出按钮,因此在 case 'Option 2' 中我添加了 robot = java.awt.Robot; robot.keyPress(java.awt.event.KeyEvent.VK_ESCAPE); robot.keyRelease(java.awt.event.KeyEvent.VK_ESCAPE);
    猜你喜欢
    • 2018-04-21
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多