如何在Matlab中的UI App中打印短信

How to print text message in UI App in Matlab

我正在 MATLAB 中开发应用程序,我使用应用程序设计来构建它。我添加了一个文本区域元素,我在其中向用户显示消息(类似于命令 window 的用法)。在应用程序中,用户可以按下按钮,这会触发要执行的功能,并且在这些功能中,我希望能够在此文本区域元素中显示一些消息。

这是我用来在此文本区域中显示文本的代码示例。我使用计数器在列表中添加文本并模拟显示而不覆盖以前的消息。

% display execution message
app.nb_Text_stock                                   = app.nb_Text_stock + 1;
app.OutputStatusTextArea.Value(app.nb_Text_stock)   = {'My test here'};

如您所见,我需要 app 元素。然后我可以将它一直传递给函数,直到我需要显示文本的级别,但我真正的问题是,我可以从函数内部访问 app 元素而不将其作为参数传递吗?我想这样做的原因是我还有一个非 GUI 版本的脚本,我无法将 app 作为参数传递。所以为了让事情更简单,我想要一个参数 GUI = 1 或 0,然后基于该显示在命令 window if GUI = 0 或在 GUI 的文本区域中如果 GUI = 1 . 但为此我需要从我的函数内部访问 app 元素。有没有正确的方法来做到这一点?或者您对这个问题的另一种方法有什么建议吗?

如果您有任何图形对象的句柄,您可以使用 .Parent.Children 字段(例如 hObject.Parent.Parent.Children(3).String = 'foo')在同一图形中找到几乎任何其他对象,可选地使用 ancestor. If you don't have any object handles, you can use findall,但这需要一些方法来识别正确的 figures/controls。这可以使用他们的 Tag 字段来完成,但需要事先指定。

您可以使用 setappdata, and get the object using getappdata 存储 app 对象:

  • startupFcn函数中存储app(创建组件后执行的代码):
    通过在 "Code View" 中添加回调来添加 startupFcn

    % Code that executes after component creation
    function startupFcn(app)
        % Store app in the root object (setappdata(groot, 'my_app', app) also works).
        setappdata(0, 'my_app', app)
    end
    
  • 从任意函数读取 app 对象:

    app = getappdata(0, 'my_app');
    

注:

  • 这不是一个好的编码习惯。

你应该做什么:

function NonGuiFun()
app = app1();
app.func();

你要求做什么:

function NonGuiFun()

% Get app object (assuming `app` GUI is already open)
app = getappdata(0, 'my_app');

if ~isempty(app)
    app.func();
end

这里是app1class的全部代码,我用来测试的(大部分是自动生成的):

classdef app1 < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure              matlab.ui.Figure
        Button                matlab.ui.control.StateButton
        TextAreaLabel         matlab.ui.control.Label
        OutputStatusTextArea  matlab.ui.control.TextArea
    end


    properties (Access = private)
        nb_Text_stock = 0; % Description
    end

    methods (Access = public)

        function results = func(app)
            app.nb_Text_stock = app.nb_Text_stock + 1;
            app.OutputStatusTextArea.Value(app.nb_Text_stock)   = {num2str(app.nb_Text_stock)};
        end
    end


    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function startupFcn(app)
            setappdata(0, 'my_app', app)
        end

        % Value changed function: Button
        function ButtonValueChanged(app, event)
            value = app.Button.Value;
            func(app);
        end

        % Close request function: UIFigure
        function UIFigureCloseRequest(app, event)
            setappdata(0, 'my_app', [])
            delete(app)

        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 640 480];
            app.UIFigure.Name = 'UI Figure';
            app.UIFigure.CloseRequestFcn = createCallbackFcn(app, @UIFigureCloseRequest, true);

            % Create Button
            app.Button = uibutton(app.UIFigure, 'state');
            app.Button.ValueChangedFcn = createCallbackFcn(app, @ButtonValueChanged, true);
            app.Button.Text = 'Button';
            app.Button.Position = [214 295 214 85];

            % Create TextAreaLabel
            app.TextAreaLabel = uilabel(app.UIFigure);
            app.TextAreaLabel.HorizontalAlignment = 'right';
            app.TextAreaLabel.Position = [210 211 56 22];
            app.TextAreaLabel.Text = 'Text Area';

            % Create OutputStatusTextArea
            app.OutputStatusTextArea = uitextarea(app.UIFigure);
            app.OutputStatusTextArea.Position = [281 175 150 60];

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = app1

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            % Execute the startup function
            runStartupFcn(app, @startupFcn)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end

注意 UIFigureCloseRequest 执行:setappdata(0, 'my_app', [])