从Matlab脚本文件中读取GUI数据



我创建了一个名为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的更新句柄而不将其作为参数发送。

谢谢

您可以将hObject参数传递给您的函数,并在需要使用guidata时检索您的值;例如,

function some_callback(hObject, handles, ...)
    myLoopingFunction(hObject, ...);
function myLoopingFunction(hObject, ...)
    for someVar = something
        % Update handles structure
        handles = guidata(hObject);
    end

或者你可以创建一个handle对象并把它放在handles结构中;例如,

% 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可用,但这有点像在这个简单的例子中使用大锤打开果酱罐。

最新更新