Одна функция для нескольких кнопок в Matlab

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


person Tamfor Dulin    schedule 07.07.2015    source источник
comment
должна ли функция делать что-то немного другое в зависимости от того, какой pushbutton был нажат?   -  person Hoki    schedule 07.07.2015
comment
Это программный графический интерфейс или графический интерфейс GUIDE?   -  person excaza    schedule 07.07.2015
comment
извините за очень поздний ответ, но @Hoki да, именно так.   -  person Tamfor Dulin    schedule 14.07.2015
comment
Также @excaza это программный графический интерфейс.   -  person Tamfor Dulin    schedule 14.07.2015


Ответы (2)


См. документацию по обратным вызовам. Обратные вызовы по умолчанию принимают два входных аргумента: дескриптор объекта, вызвавшего функцию, и структуру данных события от объекта, которая может быть или не быть пустой. Вы можете использовать свойства String или Tag вашей кнопки для управления поведением вашего графического интерфейса в зависимости от того, какая кнопка нажата, с помощью одной функции обратного вызова. Рассмотрим следующий пример:

function testGUI
handles.mainwindow = figure();

handles.mytextbox = uicontrol( ...
    'Style', 'edit', ...
    'Units', 'normalized', ...
    'Position', [0.15 0.80 .70 .10], ...
    'String', 'No Button Has Been Pressed' ...
    );
handles.button(1) = uicontrol( ...
    'Style', 'pushbutton', ...
    'Units', 'normalized', ...
    'Position', [0.05 0.05 .30 .70], ...
    'String', 'Button1', ...
    'Callback', {@mybuttonpress,handles} ...
    );
handles.button(2) = uicontrol( ...
    'Style', 'pushbutton', ...
    'Units', 'normalized', ...
    'Position', [0.35 0.05 .30 .70], ...
    'String', 'Button2', ...
    'Callback', {@mybuttonpress,handles} ...
    );
handles.button(3) = uicontrol( ...
    'Style', 'pushbutton', ...
    'Units', 'normalized', ...
    'Position', [0.65 0.05 .30 .70], ...
    'String', 'Button3', ...
    'Callback', {@mybuttonpress,handles} ...
    );
end

function mybuttonpress(src, ~, handles)
switch src.String
    case 'Button1'
        handles.mytextbox.String = 'Button 1 Has Been Pressed';
    case 'Button2'
        handles.mytextbox.String = 'Button 2 Has Been Pressed';
    case 'Button3'
        handles.mytextbox.String = 'Button 3 Has Been Pressed';
    otherwise
        % Something strange happened
end
end

Обратите внимание, что для этого требуется MATLAB R2014b или новее, чтобы использовать запись через точку для доступа к свойствам объекта. См. эту запись в блоге для получения дополнительной информации.

person excaza    schedule 07.07.2015
comment
Извините за поздний ответ, но это отличная идея, но что, если бы я бесконечно создавал кнопку и хотел, чтобы она работала с этим. Так, например, есть только одна кнопка и еще одна кнопка для создания той же кнопки, что и эта кнопка. Я просто решил создать 50 таких кнопок, и я по-прежнему хочу, чтобы они имели ту же функциональность, что и этот код, но без хлопот с созданием 50 случаев, как мне это сделать? Потому что моя идея заключалась в использовании sprintf('Button_%s',[value on tag or string]); - person Tamfor Dulin; 14.07.2015
comment
@TamforDulin Я не уверен, что понимаю. Я бы предложил задать новый вопрос с некоторыми дополнительными деталями. - person excaza; 14.07.2015
comment
Мне жаль. Но я создал функцию, которая создает любое количество кнопок, которое пожелает пользователь. Таким образом, у него будет функция, аналогичная тому, что вы создали. Но вместо фактического ограничения количества кнопок до 3. Любое количество кнопок будет связано с одной функцией. Но все кнопки делают одно и то же, но немного по-разному в зависимости от нажатой кнопки. - person Tamfor Dulin; 14.07.2015

Вы можете просто определить общую функцию и вызвать ее из всех ваших обратных вызовов кнопок.

person Shikhar Sharma    schedule 07.07.2015
comment
Просто написать функцию не очень полезный ответ. - person excaza; 07.07.2015