向MATLAB图形(不是GUI)添加按钮以退出循环

时间:2016-09-15 02:28:37

标签: matlab button

我创建了一个脚本,该脚本进入while循环获取传入的COM端口数据,并生成一个用所述数据更新的数字。

目前,我没有一种优雅的方法来退出这个循环。我希望能够添加一个按钮来实现这一目标,但我对这个主题的了解是模糊的。

我真的不想创建一个GUI,想知道我是否可以在我的身上拍一个按钮。

我尝试过:

创建一个单独的m文件来容纳按钮回拨以获得按钮状态:

function [button_state] = fun1(hObject, eventData)
    button_state = get(hObject, 'Value');
end

在while循环中,我有以下按钮声明,其中' fig'是我的人物情节:

while 1 > 0

    ...

    fig = figure(1);

    ...

    tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop', 'Callback', @fun1);

    out = fun1(tb);
    if out == 1
        break;
    end

end

似乎无法工作......非常感谢任何帮助。感谢。

4 个答案:

答案 0 :(得分:3)

如果你发现自己在主循环中创建任何对象,那么很可能你没有做正确的事情:在这里,在循环的每次迭代中,你创建一个新的togglebutton。虽然因为它们是在同一位置重复创建的,但它在视觉上并不明显。事实上,如果您能够足够快地点击以便在下一次覆盖此按钮之前点击完成,则您的代码可以正常工作。

您应该在循环外创建togglebutton,如果您只对其Value属性感兴趣,也不必使用回调。此外,您需要在不同位置使用drawnowpause来确保所有事件得到妥善处理:

fig = figure(1);
tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop');
drawnow;
while true
    drawnow;
    if (get(tb, 'Value')==1); break; end
end
close all

答案 1 :(得分:2)

好的,所以你有几个问题。

  1. 您正在while循环中创建按钮,因此它会一次又一次地创建。

  2. 您给它回调并直接调用回调。在这种情况下,您甚至不需要回调函数,因为按下按钮会更改Value属性。

  3. 您可以通过创建按钮然后直接在循环内检查其值来实现目标。

    以下是一些可以满足您需求的代码:

    fig = figure(1);
    tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop');
    
    while true % loop for forever
        drawnow %this command makes sure background functions (callbacks) run
        if tb.Value == 1 %read the value of the uicontrol
        % alternatively use: if get(tb, 'Value') == 1    
            break;
        end
    end
    

    编辑:这是一种更简单的方法

    fig = figure(1);
    tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop');
    
    while tb.Value == 0 % loop until button is pressed
        % do stuff
        drawnow % run background functions
    end
    

答案 2 :(得分:0)

另一种解决方案是使用全局变量(例如stoploop)。

修改您的函数fun1

function [button_state] = fun1(hObject, eventData)
    global stoploop
    stoploop = (get(hObject, 'Value')==1);
    % in new version of MATLAB
    % stoploop = (hObject.Value==1);
end

和主要脚本:

global stoploop
stoploop = false;

...

fig = figure(1);
tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop', 'Callback', @fun1); 
% declaration of button inside while-loop is not necessary

while true

    ...

    if stoploop 
       stoploop = false;
       break
    end

end    

对于while - 循环,您可以使用简短版本:

while ~stoploop 

    ...

end

答案 3 :(得分:-1)

实际上我认为你应该将你的代码添加到fun1.m中因为如果你在按钮上添加回调属性时按下按钮就会引用fun1.m。我个人并不建议你处理GUI with while循环。