MATLAB App - Добавить путь перед созданием компонента
У меня есть MATLAB App App.mlapp в определенной папке ~/myapp/
, Используемые им функции и некоторые графические элементы, используемые в графическом интерфейсе, находятся в ~/myapp/subfolder
, Для корректного запуска App.mlapp мне нужно каждый раз вручную добавлять ~/myapp/subfolder
на мой путь перед запуском приложения.
Как я могу автоматически добавить подпапку?
Я пытался положить addpath(genpath(~/myapp/subfolder));
в начале StartupFcn
, Тем не менее, как StartupFcn
вызывается после создания компонента, который уже требует часть графики в ~/myapp/subfolder
этот подход не работает. Компоненты создаются с использованием автоматически созданной функции createComponents
, который нельзя редактировать с помощью редактора дизайнеров приложений.
Минимальный пример по запросу excaza. Чтобы создать его, откройте Дизайнер приложений, создайте новое приложение, добавьте кнопку в представлении "Дизайн" и укажите значок в пути с помощью Свойства кнопки -> Текст и значок -> Дополнительные свойства -> Файл значка. Затем удалите каталог значка из пути и попробуйте запустить приложение.
classdef app1 < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Button matlab.ui.control.Button
end
% App initialization and construction
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure
app.UIFigure = uifigure;
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'UI Figure';
% Create Button
app.Button = uibutton(app.UIFigure, 'push');
app.Button.Icon = 'help_icon.png';
app.Button.Position = [230 321 100 22];
end
end
methods (Access = public)
% Construct app
function app = app1
% Create and configure components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
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
1 ответ
Хотя я понимаю решение MATLAB заблокировать большую часть кода GUI при проектировании в appdesigner
Я также довольно открыто говорил им о потенциальных существенных недостатках, таких как этот.
Помимо Soapbox, вы можете обойти это, используя поведение спецификации свойств класса MATLAB, которое инициализирует свойства их свойствами по умолчанию до выполнения остальной части кода класса.
В этом случае мы можем добавить фиктивную приватную переменную и установить ее на вывод addpath
:
properties (Access = private)
oldpath = addpath('./icons')
end
Который обеспечивает желаемое поведение при прохождении соответствующего пути.