加载中…
个人资料
uleen
uleen
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,095
  • 关注人气:74
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MATLAB GUI编程小示例

(2011-03-03 15:56:24)
标签:

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;

 

运行结果:

 http://s11/middle/6f57a715t9d8f631d582a&690GUI编程小示例" TITLE="MATLAB GUI编程小示例" />


//有些注意的地方用红色标识。
备注:①例如在屏幕上建立一个按钮,点击绘制正弦曲线:
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 GUI编程小示例" />

如果将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 GUI编程小示例" />

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,见上面的关系图。明确十个对象的关系(各对象之间的亲属关系)很重要。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:超星小记
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有