Radio Button not working exclusively and giving error in MATLAB GUI

血红的双手。 提交于 2019-12-08 13:09:57

问题


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...


回答1:


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.



来源:https://stackoverflow.com/questions/35994663/radio-button-not-working-exclusively-and-giving-error-in-matlab-gui

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!