Верните выбор всплывающего меню в MATLAB, используя одну строку кода

У меня есть графический интерфейс, который использует выбор из всплывающего меню в другом обратном вызове. Есть ли способ вернуть выбранное значение всплывающего меню только в одну строку без создания каких-либо временных переменных? Я пробовал несколько решений, но мне удалось только две строки с одной временной переменной:

Три строки:

list=get(handles.popupmenu1,'String');
val=get(handles.popupmenu1,'Value');
str=list{val};

Две строки:

temp=get(handles.popupmenu1,{'String','Value'});
str=temp{1}{temp{2}};

Может ли кто-нибудь сократить его до одного?

PS. Это динамическое меню, поэтому я не могу просто использовать get(handles.popupmenu1,'Value') и полностью игнорировать строковый компонент.


person Doresoom    schedule 03.05.2010    source источник
comment
Я не уверен, почему вы хотите сократить его до одной строки, если вам просто не интересно, как это можно сделать. Трехстрочный вариант является самым ясным и простым для понимания, и именно его я буду использовать в любом написанном мной коде.   -  person gnovice    schedule 03.05.2010
comment
@gnovice В основном мне было интересно, можно ли это сделать. Может быть, смесь любопытства и раздражения на MATLAB за то, что у него нет возможности сделать это одним вызовом get.   -  person Doresoom    schedule 03.05.2010


Ответы (3)


Вот однострочный:

str = getCurrentPopupString(handles.popupmenu1);

А вот и определение getCurrentPopupString

function str = getCurrentPopupString(hh)
%# getCurrentPopupString returns the currently selected string in the popupmenu with handle hh

%# could test input here
if ~ishandle(hh) || strcmp(get(hh,'Type'),'popupmenu')
error('getCurrentPopupString needs a handle to a popupmenu as input')
end

%# get the string - do it the readable way
list = get(hh,'String');
val = get(hh,'Value');
if iscell(list)
   str = list{val};
else
   str = list(val,:);
end

Я знаю, что это не тот ответ, который вы искали, но он отвечает на заданный вами вопрос :)

person Jonas    schedule 03.05.2010
comment
@Jonas: Туше, за практическое решение моего вопроса об ОКР. - person Doresoom; 03.05.2010
comment
Вы должны удалить логическое НЕ из strcmp следующим образом: if ~ishandle(hh) || strcmp (получить (чч, 'Тип'), 'всплывающее меню') - person BAR; 18.11.2012
comment
Несмотря на то, что это старый ответ, он все еще очень полезен! Я изменил последнюю строку следующим образом для раскрывающихся меню, где значение String не является ячейкой: str = list(val,:); - person Josh; 16.07.2013
comment
@Josh: Спасибо за предупреждение. Я отредактировал свой ответ соответственно. - person Jonas; 16.07.2013

Я знаю, что это глупо, но я не удержался:

list=get(handles.popupmenu1,'String'); str=list{get(handles.popupmenu1,'Value')};

Я знаю, что вы не это имели в виду, но, как и другие ответы выше, это отвечает на ваш вопрос... :-)

person Yair Altman    schedule 03.05.2010

Чтобы сделать его однострочным, я бы просто создал свою собственную функцию (т.е. getMenuSelection), например Jonas иллюстрирует в своем ответе. Если вам действительно нужен однострочный текст, вот пример с использованием CELLFUN:

str = cellfun(@(a,b) a{b},{get(handles.popupmenu1,'String')},{get(handles.popupmenu1,'Value')});

Очень некрасиво и трудно читается. Я бы определенно написал свою собственную функцию.

EDIT: А вот немного более короткий (но такой же уродливый) однострочник с использованием FEVAL:

str = feval(@(x) x{1}{x{2}},get(handles.popupmenu1,{'String','Value'}));
person gnovice    schedule 03.05.2010
comment
+1 за то, что дал мне ответ, который я действительно хотел, каким бы непрактичным он ни был - person Doresoom; 03.05.2010