2024年2月21日发(作者:)

1、很简单,在界面上放三个单选按钮控制颜色(R、G、B),四个pushbutton(功能分别为绘制正弦、余弦、grid off、退出程序),可作为一个小小的入门。

程序为:

%simpleGUI2.m-a simple use of Radiobutton and Pushbutton

clear all;

FigWin=figure('Position',[100,100,600,300],'Name','Uicontrol:Push

Button & RadioButton',...

'NumberTitle','off');

AxesHandle=axes('Position',[0.4,0.15,0.5,0.8],'Box','on');

RadioNum=3;

for i=1:RadioNum

Radio(i)=0;%initial value=0

end

Radio(1)=uicontrol(FigWin,...%父对象FigWin(一figure对象),备注③

'Style','Radio',...

'Position',[50 255 100 30],...

'String','Draw in Red',...

'CallBack',...

['n=1;'...

'if get(Radio(1),''Value'')==1;'...%要使各radio button之间具有互斥性,要用if...else语句

'set(Radio([1:(n-1),(n+1):RadioNum]),''Value'',0);'...

'else;'...%要加上分号,一种规定?参备注①

'set(Radio(1),''Value'',1);'...

'end;'...

'ColorStr=''r'';'...

'set(FunHandle,''Color'',''red'')']);%曲线颜色根据radio button的选项实时变化,ColorStr是一个全局变量

Radio(2)=uicontrol(FigWin,...

'Style','Radio',...

'Position',[50 215 100 30],...

'String','Draw in Green',...

'CallBack',...

['n=2;'...

'if get(Radio(2),''Value'')==1;'...

'set(Radio([1:(n-1),(n+1):RadioNum]),''Value'',0);'...

'else;'...

'set(Radio(2),''Value'',1);'...

'end;'...

'ColorStr=''g'';'...

'set(FunHandle,''Color'',''green'')']);

Radio(3)=uicontrol(FigWin,...

'Style','Radio',...

'Position',[50 175 100 30],...

'String','Draw in Blue',...

'CallBack',...

['n=3;'...

'if get(Radio(3),''Value'')==1;'...

'set(Radio([1:(n-1),(n+1):RadioNum]),''Value'',0);'...

'else;'...

'set(Radio(3),''Value'',1);'...

'end;'...

'ColorStr=''b'';'...

'set(FunHandle,''Color'',''blue'')']);

push1=uicontrol(FigWin,...

'Style','pushbutton',...

'Position',[50 135 100 30],...

'String','Plot sin(x)',...

'CallBack',...

['subplot(AxesHandle);' ...%注意父对象是AxesHandle而非FigWin!参备注②

'x=0:.1:4*pi;'...

'FunHandle=plot(x,sin(x),ColorStr);'...%ColorStr变量的值受radiobutton控制

'axis([0 4*pi -1 1]);'...

'grid on;'...

'xlabel(''x'');'...

'ylabel(''y=sin(x)'');']);

push2=uicontrol(FigWin,...

'Style','pushbutton',...

'Position',[50 95 100 30],...

'String','Plot cos(x)',...

'CallBack',...

['subplot(AxesHandle);' ...

'x=0:.1:4*pi;'...

'FunHandle=plot(x,cos(x),ColorStr);'...

'axis([0 4*pi -1 1]);'...

'grid on;'...

'xlabel(''x'');'...

'ylabel(''y=cos(x)'');']);

push3=uicontrol(FigWin,...

'Style','pushbutton',...

'Position',[50 55 100 30],...

'String','Grid off',...

'CallBack','grid off;');%参备注①

push4=uicontrol(FigWin,...

'Style','pushbutton',...

'Position',[50 15 100 30],...

'String','Exit',...

'CallBack','close(FigWin)');

%绘制初始曲线

ColorStr='r';

set(Radio(1),'Value',1);

X=0:0.1:4*pi;

FunHandle=plot(X,sin(X),ColorStr);

axis([0 4*pi -1 1]);

xlabel('x');

ylabel('y=sin(x)');

grid on;

运行结果:

//有些注意的地方用红色标识。

备注:①例如在屏幕上建立一个按钮,点击绘制正弦曲线:

push1=uicontrol(FigWin,...

'Style','pushbutton',...

'Position',[50 135 100 30],...

'String','Plot sin(x)',...

'CallBack',...

['subplot(AxesHandle);'...

'x=0:.1:4*pi;'...

'plot(x,sin(x));'...

'axis([0 4*pi -1 1]);'...

'grid on'...

'xlabel(''x'');'...

'ylabel(''y=sin(x)'');']);

出错:

Error using ==> grid at 104

Unknown command option.

Error while evaluating uicontrol Callback

在grid on后添加分号,正确;

对于CallBack参数,后面的矩阵([]里的内容)给出(点击按钮后)要执行的命令序列,[]表示其是一个矩阵,矩阵元素之间可以接受空格、逗号,如:['subplot(AxesHandle);',...或['subplot(AxesHandle);' ...,或者后面用了续行符...也可以不加逗号或空格(没有续行符时矩阵元素之间必须要有分隔符——逗号或空格)。如果只有单个语句也可以不用[](如'CallBack','grid

off;'),但每个语句后必须给出分号“;”,在Command Window中,对于grid

on这种控制语句是可以不写分号的。另外,因为语句xlabel('x')已处于一个单引号中,故x要使用两对单引号(要不然,'x'中的左单引号就和句首的单引号配对了,显然不对)。

如果else后面没有分号,如:'else'...运行时会出错:

Undefined function or method 'elseset' for input arguments of type

'double'.

Error while evaluating uicontrol Callback

%将else与下行的set视为一体了……

备注②:如果将那行改为['subplot(FigWin);' ...则运行出错:

Error using ==> subplot at 141

Index must be a 3-digit number of the format mnp.

Error while evaluating uicontrol Callback

原因:subplot(h)只接受axes对象h,而不接受figure对象,参下图:

如果将subplot改为plot可行吗?不行,提示出错:

Error using ==> plot

Not enough input arguments.

Error while evaluating uicontrol Callback

Error using ==> plot

Not enough input arguments.

//plot没有此用法:

subplot才有此用法:

subplot(h) makes the axes object with handle h current for subsequent

plotting commands.

subplot有两个作用:A、创建子绘图区域;B、起到焦点转移的作用。曲线绘制命令(函数)还是plot

备注③:同理,如果改成:

Radio(1)=uicontrol(AxesHandle,...

也会出错:

Error using ==> uicontrol

Invalid figure or uicontrol handle

Error in ==> simpleGUI2 at 12

Radio(1)=uicontrol(AxesHandle,...

原因同备注②——axes对象不接受uicontrol,见上面的关系图。明确十个对象的关系(各对象之间的亲属关系)很重要。