2016-08-09 15 views
0

Я пытаюсь создать простую кнопку «просмотра» на графическом интерфейсе Matlab (R2016a). Мой код что-то вроде:Использование uigetdir в качестве обратного вызова для кнопки, сбой из-за странных, недопустимых аргументов

hd = dialog; 
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',... 
'callback',@uigetdir); 

Функция обратного вызова uigetdir имеет 2 дополнительных аргументов STARTPATH, TITLE. В принципе я мог бы передать их на моем обратном вызов путем конкатенации их с помощью функции ручки на массиве ячеек, такие как

hd = dialog; 
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',... 
'callback',{@uigetdir,'myStartPath','myTitle'); 

ли звонки uigetdir моя кнопка просмотра с или без дополнительных аргументов, это приведет к краху. Различные ошибки, одна и та же причина: uicontrol решает включить 2 невостребованных, странных переменных (содержащих свойства пользовательского интерфейса) в качестве аргументов функции обратного вызова, а uigetdir не знает, что с ними делать.

Означает ли это, что я не могу использовать uigetdir (или почти любую другую встроенную функцию) в качестве функции обратного вызова в графическом интерфейсе? Должно быть решение, помимо написания пользовательской функции, нет?

+1

Я предлагаю прочитать [документацию для обратных вызовов] (http://www.mathworks.com/help/matlab/creating_guis/write-callbacks-using-the-programmatic-workflow.html#f16-1001315) – excaza

+1

Действительно? Из документации: «Определение функции должно определять два входных аргумента:« hObject »и« callbackdata ». Handle Graphics® автоматически передает« hObject »и« callbackdata »при вызове функции». – excaza

+1

Также из документации: «Примечание. Если вы хотите использовать существующую функцию, которая не поддерживает аргументы« hObject »и« callbackdata », вы можете указать ее как анонимную функцию. Например,' uicontrol ('Style' , 'slider', 'Callback', @ (hObject, callbackdata) myfunction (x)); '" – excaza

ответ

4

По умолчанию все uicontrol объекты передаются два входных аргумента:

  • Сам
  • Объект, содержащий информацию, относящуюся к событию uicontrol ручка.

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

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

set(hb, 'Callback', @(s,e)uigetdir()) 

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

set(hb, 'Callback', @(s,e)uigetdir('mystartpath', 'mytitle'))