旗帜鲜明地反对从GUIDE入门Matlab GUI。
使用GUIDE做GUI的最大也是唯一的优点便是直观、低门槛,代价却是沉重的——对于一个大型的界面系统,后期如要修改,将会是天大的工作量。
GUIDE的门槛确实很低,上手很快,但是同样,它的上限也很低。对于一个有点基础和追求的同学,我都不建议学习GUIDE制作Matlab GUI。好的习惯要从一开始培养,不要给自己设限。
在这篇回答里,我将以一个例子分享我做GUI的一个套路。文末更新了界面代码文件,有爱自取。
先上几个作品:大家都用matlab做过哪些有趣的事儿?www.zhihu.com
在一个界面系统下,每一个.m脚本文件对应一个界面。我们以上图中极简风格的【线性拟合】的代码讲解基本构成:
【0】初始化
clc;close all;clear all;
【2】创建界面
global hF_start
hF_start=figure('menubar','none','Resize','off','NumberTitle','off','position',...
[100,200,1200,700],'name','线性拟合','Visible','on');
【3】声明全局变量
这个等到最后确定需要传递的变量后再统一声明
global xx
【4】控件参数设置
在这一环节,主要将要设置的控件按照区域划分成不同的数组,之所以按照区域划分,主要标准是在设置位置的时候有规律可循(比如x/y相同),有规律,就可以用循环。
ui_text_1 ={'温度(℃)','压强(atm)','线吸收强度'};
unit ='*1e-24cm/molecule';
edit_text1 ={'30','0.0845526','8.273'};
ui_text_20 ={'初始值','计算值'};
ui_text_2 ={'q','z','碰撞偏移 d','碰撞展宽 g','FD多普勒','α','ξ','β','b af(x)+b','a af(x)+b'};
edit_text_2_1={'6','0.01','0','0','0.5','2','0','0','0','1'};
edit_text_2_2={'','','','','','','','','',''};
ui_text_3 ={'气体分压','气体浓度','计算耗时'};
unit_text_3 ={'atm','ppm','s'};
Text_CallBack={'原始数据','计算','结果导出','清除'};
Fun_CallBack ={'Input0','calculate','Output0','Clearaxes'};
我在这里只设置了文本,如果在草稿上确定布局,还可以把坐标设置好。
【5】控件设置
然后就开始循环设置控件了。以下是我对ui_text2的控件设置:
for i=1:length(ui_text_2)
if i>0 && i<=4
ui_2(i)=uicontrol(gcf,'style','push','string','振动点','ForegroundColor',bb,'value',0,'fontsize',15,'position',[230+l 240+(i-1)*60+d 80 30],'visible','on');
edit21(i)=uicontrol(gcf,'style','edit','fontname','Times New Roman','BackgroundColor',aa,'string','100','value',0,'ForegroundColor',bb,'fontsize',12,'position',[310+l 240+(i-1)*60+d 50 30],'visible','on');
edit22(i)=uicontrol(gcf,'style','edit','fontname','Times New Roman','BackgroundColor',aa,'string','100','value',0,'ForegroundColor',bb,'fontsize',12,'position',[310+50+l 240+(i-1)*60+d 50 30],'visible','on');
elseif i>4 && i<=8
ui_2(i)=uicontrol(gcf,'style','push','string','振动点','ForegroundColor',bb,'value',0,'fontsize',15,'position',[430+l 240+(i-1-4)*60+d 80 30],'visible','on');
edit21(i)=uicontrol(gcf,'style','edit','fontname','Times New Roman','BackgroundColor',aa,'string','100','value',0,'ForegroundColor',bb,'fontsize',12,'position',[510+l 240+(i-1-4)*60+d 50 30],'visible','on');
edit22(i)=uicontrol(gcf,'style','edit','fontname','Times New Roman','BackgroundColor',aa,'string','100','value',0,'ForegroundColor',bb,'fontsize',12,'position',[510+50+l 240+(i-1-4)*60+d 50 30],'visible','on');
else
ui_2(i)=uicontrol(gcf,'style','push','string','振动点','ForegroundColor',bb,'value',0,'fontsize',15,'position',[630+l 240+(i-1-8)*60+d 80 30],'visible','on');
edit21(i)=uicontrol(gcf,'style','edit','fontname','Times New Roman','BackgroundColor',aa,'string','100','value',0,'ForegroundColor',bb,'fontsize',12,'position',[710+l 240+(i-1-8)*60+d 50 30],'visible','on');
edit22(i)=uicontrol(gcf,'style','edit','fontname','Times New Roman','BackgroundColor',aa,'string','100','value',0,'ForegroundColor',bb,'fontsize',12,'position',[710+50+l 240+(i-1-8)*60+d 50 30],'visible','on');
end
set(ui_2(i),'string',ui_text_2{i})
set(ui_2(i),'style','text');
set(ui_2(i),'BackgroundColor',Bcolor);
%set(edit21(i),'fontsize',15)
set(edit21(i),'string',edit_text_2_1{i});
set(edit22(i),'string',edit_text_2_2{i});
end
以上就是一个界面的基本设置,而对于回调函数,细心的同学应该看到了,我在【4】中设置了两行Text_CallBack和Fun_CallBack,对应的就是功能键的名字和相应回调函数的名字。然后回调函数,直接就在Input0.m,calculate.m里面写。这就是大家很熟悉的基本的Matlab功能编写了。
最后,提醒一下:除了主界面,其他所有脚本(包括子界面和功能函数),都不要在开头初始化。
我曾不止一次地跟我的同学朋友强调过这样一个观点:网上的信息鱼龙混杂,要学会分辨。很多教程只是一些新手刚刚学会便迫不及待想要分享喜悦而带来的不成熟的经验,或许并没有错,但是会走很多弯路,也会限制你的视野。
我想,当你熟练掌握GUIDE的时候,大抵也没有动力去学习用脚本写GUI了。这不能不说是一种遗憾吧。
我在15年由于参加的项目的需要开始学习GUI,我很庆幸我的GUI入门是一本叫做《Matlab GUI学习手记》的相对专业的书籍,作者以高屋建瓴的方式带我一睹了Matlab GUI的大概,这让我一开始就接触了用脚本控制界面的方法,从而少走了很多弯路。
我觉得Matlab GUI,这一本书就足够了。
Main.m
8.2K ·
百度网盘