Как выполнить функцию обратного вызова из другого файла функции в MATLAB? - PullRequest
2 голосов
/ 30 ноября 2009

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

Когда я копаю рисунок с get(gcf,'children'), я нахожу кнопки со свойством Callback, которое выглядит следующим образом:

ans = 
    [function_handle]
    [              1]
    [              1]
    [1x6 double]

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

Ответы [ 2 ]

3 голосов
/ 30 ноября 2009

Из результата, полученного для обратного вызова кнопки, получается, что обратный вызов был создан следующим образом (только для примера):

hButton = uicontrol(...,'Callback',{@button_callback,1,1,[1:6]});

где функция обратного вызова button_callback определяется следующим образом:

function button_callback(hObject,eventdata,a,b,c)
  ...
end

Обратите внимание, что два дополнительных аргумента в списке входных аргументов для функции обратного вызова: hObject (хэндл объекта, вызывающего обратный вызов) и eventdata ( структура данных события).

Если вы хотите вызвать дескриптор функции с 3 дополнительными аргументами, которые должны быть ему переданы (1, 1 и массив 1 на 6), вам также необходимо передать аргументы для hObject и eventdata входы. Вот как будет выглядеть вызов функции (используя вашу переменную ans):

ans{1}(hButton,[],ans{2:end});

Сначала вы получаете дескриптор функции из массива ячеек (ans{1}), а затем вызываете его, используя скобки, как и любую другую функцию . Для hObject вы можете передать дескриптор объекту uicontrol (или пустому значению, если оно не нужно), а для eventdata вы можете просто передать пустое значение. Затем дополнительные значения берутся из массива ячеек в виде списка, разделенного запятыми (ans{2:end}), и каждое из них передается функции в качестве отдельного дополнительного аргумента.

1 голос
/ 30 ноября 2009

Вы можете вызвать его с помощью оператора () или передать его feval. Сначала вам нужно извлечь его из массива ячеек.

x; % holds your ans from original question
fcn = x{1}; % Extract from cell array
fcn(); % call with () syntax
feval(fcn); % call with feval() syntax

Если это не сработает, пожалуйста, напишите точный код и сообщение об ошибке, чтобы мы могли увидеть, что идет не так.

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