MATLAB GUI编程小示例

标签:
gui示例 |
很简单,在界面上放三个单选按钮控制颜色(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对象,参下图:
http://s2/middle/6f57a715t9d8fe24eb481&690GUI编程小示例" TITLE="MATLAB
如果将subplot改为plot可行吗?不行,提示出错:
??? Error using ==> plot
Not enough input arguments.
??? Error while evaluating uicontrol Callback
??? Error using ==> plot
Not enough input arguments.
//plot没有此用法:
http://s7/middle/6f57a715t9d8fecca4566&690GUI编程小示例" TITLE="MATLAB
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,见上面的关系图。明确十个对象的关系(各对象之间的亲属关系)很重要。