Доступ к вложенным функциям из GUI

Я пытаюсь использовать почти все-в-одном функцию, которая создает GUI и необходимые переменные в основной функции и вложенные функции для использования в качестве действий обратного вызова.

Когда у меня есть

function[]=foo()
A=1;

uicontrol('style','pushbutton','callback','A=bar(A);')

function[OUT]=bar(IN)
OUT=IN+1;

Я получаю ошибку:

Undefined function 'bar' for input arguments of type 'double'.

Error while evaluating uicontrol Callback`

если foo это сценарий и bar определяется в bar.m файл это работает. Мне кажется, что обратные вызовы используют в переменных по умолчанию в рабочем пространстве MATLAB и scripts/fuctions в текущем рабочем каталоге. Как я могу получить доступ к переменным, определенным в вызывающей функции (здесь переменная A) и функции, вложенные в вызывающую функцию (здесь функция bar)

1 ответ

Решение

Для определения обратных вызовов я нашел самый надежный подход - использовать анонимные функции. Это, как говорится, если bar является вложенной функцией fooто он уже имеет доступ к A и может изменить A,

function = foo()
    A = 1;

    uicontrol('style', 'pushbutton', 'callback', @(s,e)bar())

    % This is a nested function that already has access to A
    function bar()
        A = A + 1;
    end

    % Let's call bar here to demonstrate it updates A
    bar();
    disp(A);
end

Кроме того, ваши обратные вызовы не могут фактически передавать выходные данные обратно в рабочую область элемента управления, для которого они являются обратным вызовом. Если вы хотите вернуть результат, вам нужно либо: 1) сохранить результат в UserData графического объекта, 2) использовать вложенную подфункцию, как мы показали, либо 3) передать дескриптор объекта пользовательского дескриптора в Перезвоните (classdef object < handle)

Другие вопросы по тегам