Я работаю над приложением в MATLAB и использую дизайн приложения для его создания. Я добавил элемент текстовой области, в котором я отображаю сообщения для пользователя (аналогично использованию в окне команд). В приложении пользователь может нажимать кнопки, которые запускают функции для выполнения, и в рамках этих функций я хотел бы иметь возможность отображать некоторые сообщения в этом элементе текстовой области.
Это пример кода, который я использую для отображения текста в этой текстовой области. Я использую счетчик для добавления текста в список и имитации отображения без перезаписи предыдущих сообщений.
% display execution message
app.nb_Text_stock = app.nb_Text_stock + 1;
app.OutputStatusTextArea.Value(app.nb_Text_stock) = {'My test here'};
Как видите, мне нужен элемент приложения. Затем я мог бы передать его функции до уровня, на котором мне нужно отобразить текст, но мой настоящий вопрос заключается в том, могу ли я получить доступ к элементу приложения из функции, не передавая его в качестве аргумента? Причина, по которой я хочу это сделать, заключается в том, что у меня также есть версия сценария без графического интерфейса пользователя, где я не смог бы передать приложение в качестве аргумента. Чтобы упростить задачу, я хотел бы иметь параметры GUI = 1 или 0, а затем на основе этого отображения либо в командном окне, если GUI = 0, либо в текстовой области в GUI, если GUI = 1. Но для этого Мне нужно получить доступ к элементу приложения изнутри моей функции. Есть ли правильный способ сделать это? Или у вас есть предложения для другого подхода к этой проблеме?
Всего 2 ответа
Если у вас есть дескриптор любого графического объекта, вы можете найти практически любой другой объект на том же рисунке, используя .Parent
и .Parent
(например, hObject.Parent.Parent.Children(3).String = 'foo'
), необязательно используя ancestor
. Если у вас нет дескрипторов объектов, вы можете использовать findall
, но для этого потребуются некоторые средства идентификации правильных фигур / элементов управления. Это можно сделать с помощью их поля Tag
, но для этого потребуется указать его заранее.
Вы можете сохранить объект app
используя setappdata , и получить объект, используя getappdata :
Сохранить 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
Вот весь код класса app1
, который я использовал для тестирования (большая его часть генерируется автоматически):
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', [])
.