farhan
farhan

Reputation: 78

Radio Button not working exclusively and giving error in MATLAB GUI

I am writing a code for MATLAB GUI for pair comparison of images but i am stuck because my radio button are not working exclusivley

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GUI_Personality_Impressions_OpeningFcn, ...
                   'gui_OutputFcn',  @GUI_Personality_Impressions_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before GUI_Personality_Impressions is made visible.
function GUI_Personality_Impressions_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to GUI_Personality_Impressions (see VARARGIN)

% Choose default command line output for GUI_Personality_Impressions
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes GUI_Personality_Impressions wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = GUI_Personality_Impressions_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.axes1,'units','pixels');
set(handles.axes2,'units','pixels');
scrz=get(0,'ScreenSize')
% pos2=[(scrz(3)-800)/2  (scrz(4)-600)/2 800 600];
fig_hr = 326;
fig_vr = 493;


pos1 = round((scrz(3)-fig_hr)/4)
pos2 = round((scrz(4)-fig_vr)/2)

% fig_xcoord = (ScreenSize(3) - fig_width)/2; 

pos3 = [pos1 pos2 fig_hr fig_vr]
set(handles.axes1,'pos',[pos3]);
axes(handles.axes1);  
imshow('Chinese_eyes+2.tif');
% pos1 = round((scrz(3)-fig_hr)/  3)
posa = pos1 +1.5* round(fig_hr);
pos4 = [posa pos2 fig_hr fig_vr]
set(handles.axes2,'pos',[pos4]);
axes(handles.axes2);
imshow('Chinese_eyes+2.tif');
% % Get default command line output from handles structure
varargout{1} = handles.output;


% handles.FigureH = figure;
handles.radio1 = uicontrol('Style', 'radiobutton', ...
                           'Callback', @myRadio, ...
                           'Units',    'pixels', ...
                           'Tag',      'A1', ...
                           'Position', [(pos1+326+pos1)/2, pos2-70,70 ,50 ], ...
                           'String',   'A', ...                           
                           'Value',    1);
handles.radio2 = uicontrol('Style', 'radiobutton', ...
                           'Callback', @myRadio, ...
                           'Units',    'pixels', ...
                           'Position', [(posa+326+posa)/2, pos2-70,70 ,50], ...
                           'String',   'B', ...
                           'Tag',      'B1', ...
                           'Value',    0);

%  handles.Next= uicontrol('Style', 'pushbutton', ...
%                            'Callback', @pushbutton1, ...                           
%                            'Units',    'pixels', ...
%                            'Position', [(((pos1+326+pos1)/2)+(posa+326+posa)/2)/2, pos2- 140,70 ,50 ], ...
%                            'String',   'Next', ...
%                            'Value',    0);                    
% set(handles.Next,'Enable','off')                       

guidata(hObject, handles);



function myRadio(hObject,eventdata, handles)
global data

switch get(hObject,'Tag') % Get Tag of selected object.
    case 'A1'
       data=1;
        set(handles.radio2, 'Value', 0);
    case 'B1'
       data=2;    
      set(handles.radio1, 'Value',0);


end

and when on the GUI I select a radio button following errors appear

"Not enough input arguments.

Error while evaluating uicontrol Callback."

The error is on the line for set i.e.set(handles.radio2, 'Value', 0);

I need help in this regard...

Upvotes: 0

Views: 106

Answers (1)

Suever
Suever

Reputation: 65430

First of all, if you want your radio buttons to operate together (only be able to select one), you want to put them into a uibuttongroup.

Second, the reason for your error is because the standard MATLAB callbacks (the ones defined with uicontrol(..., 'Callback', @callback, ...)) only pass two input arguments (compared to 3 for GUIDE GUIs).

These inputs are:

  1. The object that generated the callback (the handle to your button)
  2. Any associated event data

So you will want to modify myRadio to accept two input arguments.

function myRadio(hObject, eventData)

    switch get(hObject,'Tag') % Get Tag of selected object.
        case 'A1'
            set(handles.radio2, 'Value', 0);
        case 'B1'
            set(handles.radio1, 'Value',0);
    end
end

The other option is to manually designate the inputs to your callback function using an anonymous function. You could use this to create a callback with three inputs (just like GUIDE's own callbacks) and then your myRadio function could remain as you have it.

set(handles.radio1, 'Callback', @(src,evnt)myRadio(src, evnt, handles))

All that aside, if you use a uibuttongroup, you won't need this callback since all it does is ensures that only one radio button is selected at a time.

Upvotes: 1

Related Questions