Как напечатать текстовое сообщение в приложении UI в Matlab - PullRequest
1 голос
/ 11 февраля 2020

Я работаю над приложением в MATLAB и использую дизайн приложения для его создания. Я добавил элемент текстовой области, в котором я отображаю сообщения для пользователя (аналогично использованию в окне команд). В приложении пользователь может нажимать кнопки, которые запускают функции для выполнения, и в рамках этих функций я хотел бы иметь возможность отображать некоторые сообщения в этом элементе текстовой области.

Это пример кода Я использую для отображения текста в этой области текста. Я использую счетчик для добавления текста в список и имитации отображения без перезаписи предыдущих сообщений.

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

Как видите, мне нужен элемент app. Затем я мог бы передать его функции до уровня, на котором мне нужно отобразить текст, но мой реальный вопрос: могу ли я получить доступ к элементу приложения из функции, не передавая его в качестве аргумента? Причина, по которой я хочу это сделать, заключается в том, что у меня есть версия скрипта, отличная от GUI, где я не смог бы передать приложение в качестве аргумента. Чтобы упростить задачу, я хотел бы иметь параметры GUI = 1 или 0, а затем на основе этого отображения либо в командном окне, если GUI = 0, либо в текстовой области в GUI, если GUI = 1. Но для этого мне нужно получить доступ к элементу приложения внутри моей функции. Есть ли правильный способ сделать это? Или у вас есть предложения по другому подходу к этой проблеме?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Вы можете сохранить app объект, используя setappdata , и получить объект, используя getappdata :

  • Store app в startupFcn функция (код, который выполняется после создания компонента):
    Добавить 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

Вот весь код * Класс 1038 *, который я использовал для тестирования (большая его часть генерируется автоматически):

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', []).

0 голосов
/ 11 февраля 2020

Если у вас есть дескриптор любого графического объекта, вы можете найти практически любой другой объект на том же рисунке, используя поля .Parent и .Children (например, hObject.Parent.Parent.Children(3).String = 'foo'), опционально используя ancestor . Если у вас нет дескрипторов объектов, вы можете использовать findall, но для этого потребуются некоторые средства определения правильных фигур / элементов управления. Это можно сделать с помощью поля Tag, но для этого потребуется указать его заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...