我创建了一个脚本,该脚本进入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
似乎无法工作......非常感谢任何帮助。感谢。
答案 0 :(得分:3)
如果你发现自己在主循环中创建任何对象,那么很可能你没有做正确的事情:在这里,在循环的每次迭代中,你创建一个新的togglebutton。虽然因为它们是在同一位置重复创建的,但它在视觉上并不明显。事实上,如果您能够足够快地点击以便在下一次覆盖此按钮之前点击完成,则您的代码可以正常工作。
您应该在循环外创建togglebutton,如果您只对其Value
属性感兴趣,也不必使用回调。此外,您需要在不同位置使用drawnow
或pause
来确保所有事件得到妥善处理:
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)
好的,所以你有几个问题。
您正在while循环中创建按钮,因此它会一次又一次地创建。
您给它回调并直接调用回调。在这种情况下,您甚至不需要回调函数,因为按下按钮会更改Value属性。
您可以通过创建按钮然后直接在循环内检查其值来实现目标。
以下是一些可以满足您需求的代码:
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循环。