我创建了一个名为SCADA的GUI,我添加了一个名为StatusData的布尔变量,这是一个在启动GUI时设置为false的标志
handles.StatusData=false;
guidata(handles.output,handles);
我按下一个按钮,然后调用一个连续执行的函数(该函数具有无限循环)。一段时间后,我按下另一个按钮,将StatusData设置为true。
handles.StatusData=true;
guidata(handles.output,handles);
现在,我需要从回调函数(我上面提到的相同函数)访问StatusData
,为了解决这个问题,我在调用该函数时将句柄作为参数发送。现在,当按下更改StatusData的按钮时,实际句柄中的数据会发生变化但我无法访问更新的StatusData,因为该函数已被调用。
如何在不将其作为参数发送的情况下访问GUI的更新句柄。
由于
答案 0 :(得分:0)
您只需将hObject
参数传递给您的函数,并在需要时使用guidata
检索您的值;即,
function some_callback(hObject, handles, ...)
myLoopingFunction(hObject, ...);
function myLoopingFunction(hObject, ...)
for someVar = something
% Update handles structure
handles = guidata(hObject);
end
或者你可以创建一个句柄对象并将其放在句柄结构中;如,
% In a separate file:
classdef uiState < handle
% Probably should give this class a less general name...
properties
StatusData
end
end
% In your UI file:
function some_callback(hObject, handles, ...)
handles.state = uiState();
handles.state.StatusData = false;
% Now, when you modify handles.StatusData, the version used by
% myLoopingFunction will also be updated, because they point to
% the same object!
myLoopingFunction(handles.state);
function myLoopingFunction(state, ...)
for someVar = something
% Now you just have to check state.StatusData
end
对于简单的情况,我会使用第一种方法。对于更复杂的情况,必须跟踪几个参数并以复杂的方式进行交互,我会使用第二个。如果你在某个变量中有大量数据并希望阻止它被复制到每次调用UI中,那么第二个也很有用。
就个人而言,对于复杂的UI,我通常会创建一些跟踪用户界面的应用程序类(并为其提供命令行界面),并确保我的UI始终可用,但这有点就像在这个简单的情况下使用大锤打开果酱罐一样。