2

Мне нравится определять переменные (например, Appdata) перед созданием объектов GUI. Я не мог найти в Интернете немедленно следующие вопросы:Определение значений по умолчанию для MATLAB GUI перед созданием объекта

  • Общие вопросы 1) Что определяет порядок выполнения функций создания другого объекта _CreateFcn или они все работают параллельно?

  • Общий вопрос 2) OpeningFcn работает после создание объекта. Есть функция, которая работает до создание объекта?

  • Конкретный вопрос: Моя цель - запомнить значения свойств графического интерфейса пользователя. Поэтому после того, как свойства были изменены (например, обратными вызовами), и графический интерфейс закрыт, он должен помнить эти свойства после запуска GUI снова. Если это первый раз, когда GUI запускается, или если все appdata были сброшены, он должен использовать значения по умолчанию.

На данный момент (это работает) я определяю эти значения свойств для каждого отдельного _createFcn (см пример кода), но для 20+ создания функций очень громоздко. Можно ли определить мои приложения по умолчанию перед созданием объекта, чтобы мне не нужно было столько циклов? (См пример кода 2)

пример кода 1 (текущая ситуация):

% --- Executes during object creation, after setting all properties. 
function checkbox_res_mot_CreateFcn(hObject, eventdata, handles) 
% hObject handle to checkbox_res_mot (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles empty - handles not created until after all CreateFcns called 
if isappdata(0,'Simulation')  %check if appdata exists 
    simulation = getappdata(0,'Simulation'); 
    if any(strcmp(fieldnames(simulation),'residual_motions'))  %check if variable exists 
     set(hObject,'Value',simulation.residual_motions);  % stored value 
    else 
     set(hObject,'Value',0); % default value 
    end 
else 
    set(hObject,'Value',0); % default value 
end 
simulation.residual_motions = get(hObject,'Value');  % create appdata 
setappdata(0,'Simulation',simulation) 

пример кода 2 (предложение):

%Executs before object creation 
function default_values 
if ~isappdata(0,'Simulation') 
simulation.residual_motions = 0   % default values all in same function (only 1 variable shown as example) 
setappdata(0,'Simulation',simulation) % create appdata 

%% --- Executes during object creation, after setting all properties. 
function checkbox_res_mot_CreateFcn(hObject, eventdata, handles) 
% hObject handle to checkbox_res_mot (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles empty - handles not created until after all CreateFcns called 
simulation = getappdata(0,'Simulation');  % no need to check appdata as it has already been created 
set(hObject,'Value',simulation.residual_motions); % residual_motions has been created in 'default value' code or is saved from last GUI execution 

ответ

0

Для вашего конкретного вопроса, то вы можете либо 1), за исключением данные сеанса в файл .mat до того, как графический интерфейс закрывается и загружает его при следующем запуске графического интерфейса пользователя или 2) выводит данные сеанса в рабочее пространство до закрытия GUI и передает его функции GUI в качестве аргумента при следующем запуске GUI. Вот фрагмент кода, который реализует обе опции для очень простого графического интерфейса с именем test, который создается через GUIDE и имеет одно текстовое поле редактирования.

function test_OpeningFcn(hObject, eventdata, handles, varargin) 
if ~isempty(varargin) 
    set(handles.edit1, 'String', varargin{1}) 
elseif exist('sessiondata.mat','file') 
    temp_data = load('sessiondata.mat','output'); 
    set(handles.edit1, 'String', temp_data.output) 
end 
guidata(hObject, handles); 
uiwait(handles.figure1); 

function varargout = test_OutputFcn(hObject, eventdata, handles) 
output = get(handles.edit1, 'String'); 
varargout{1} = output; 
save('sessiondata.mat', 'output') 
delete(handles.figure1); 

function figure1_CloseRequestFcn(hObject, eventdata, handles) 
uiresume(hObject); 

Обычно при нажатии на кнопку X, чтобы закрыть графический интерфейс, по умолчанию CloseRequestFcn называется. Версия по умолчанию делает только одно: убить графический интерфейс. В приведенном выше случае мы включаем uiwait в OpeningFcn, чтобы программа ожидала ответа пользователя (что закрывает в этом случае графический интерфейс). Затем в CloseRequestFcn, uiresume направляет графический интерфейс на OutputFcn, который затем передает данные в varargout и убивает графический интерфейс пользователя.

Вы можете использовать GUI двумя способами, либо просто запустить его без аргументов, или

output = test(input) 

Без аргумента, что вы ввели в редактирования текстовом поле будет храниться в sessiondata.mat и загружены в следующий раз вы запускаете графический интерфейс. Если вы передадите аргумент функции, он будет использовать этот аргумент для изменения текста в текстовом поле редактирования. Выходным аргументом будет любой текст, оставшийся в текстовом поле редактирования, прежде чем закрыть GUI.

Ответ на общий вопрос 1: Это в основном мое предположение. Я думаю, что это определяется порядком, в котором вы создаете объекты, если используете GUIDE.Эта информация хранится в файле .fig. Я делаю это предположение, потому что GUIDE, по-видимому, отслеживает создание объекта, и информация не сохраняется в файле .m.

Ответ на общий вопрос 2: CreateFcn является частью gui_mainfcn, который предположительно является первой функцией, выполняемой при создании GUI. Пока OpeningFcn запускается после создания объекта, он выполняется до того, как GUI доступен для взаимодействия с пользователем, чтобы вы могли настроить свой графический интерфейс в OpeningFcn. Вы также можете попытаться изменить CreateFcn для каждого объекта, но вам нужно будет размещать коды в каждом CreateFcn. Итак, я думаю, что OpeningFcn будет лучшим местом для установки вашего графического интерфейса.

+0

Извините, за мой последний отзыв, но за ваш отзыв! Вы упомянули, что я могу использовать файлы .mat 'или рабочее пространство для хранения моей сессии графического интерфейса. Однако это не проблема, так как я сохранил все в 'appdata (0)'. Причина, по которой я хотел загрузить этот сеанс ** до создания объекта **, потому что каждый объект 'CreateFcn' использует эту информацию. Ваши 2 ответа на общие вопросы заставили меня понять, что будет более надежно удалить весь код из 'CreateFcn' и определить все во время' OpeningFcn'. Мне нужно выяснить, как работать с 'handles' первым, тогда я обновлю свою работу здесь! – Remco

+0

Если я ошибаюсь, 'appdata' будет потерян после закрытия вашего графического интерфейса. Он предназначен для обмена данными между обратными вызовами, когда GUI жив. Если вам нужна информация, сгенерированная во время выполнения GUI, вам понадобятся постоянные средства, такие как сохранение данных в файле или переменной в рабочей области. – user3667217

+0

В моем случае 'appdata' сохраняется до тех пор, пока сам Matlab открыт. Поэтому каждый раз, когда Matlab запускается в начале дня, он может использовать только значения по умолчанию, и это хорошо для меня. Может быть, я не использую 'appdata', поскольку он« предполагается »использоваться. Кажется, так удобно хранить все мои (глобальные) переменные в нем. – Remco