旗帜鲜明地反对从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.m8.2K · 百度网盘


马上要毕业了,曾经也花费了大量的功夫和时间去研究这个GUI,在知乎,微信公众号,CSDN等等,这里分享一下自己的一点心得,另外,这个网站是个学习matlab的好地方

【原创】利用GUI实现excel文件和table控制项的互操作 - MATLAB中文论坛?

www.ilovematlab.cn图标

当你真正学会的时候,其实就很简单了,我是因为导师的要求,需要将我所有的学习课题资料统统汇总到一个界面里边,GUI是一个非常好的东西,点一下,这个程序便可以运行,我是学电动汽车的锂离子电池BMS的一小块内容,状态预测这方面的东西,这个是我设计的OCV-SOC拟合的一个GUI,

OCV-SOC拟合界面设计

注:

1.MATLAB自带的工具箱,」cftool「也是可以很好的做这个事情的,言归正传,接下来讲讲如何去设计这个GUI。

2.我所用版本为MATLAB2016b


第一步,先创建一个GUI界面

MATLAB界面输入,」guide「,然后创建一个GUI,这里有两部分,一个是figure一个是code文件,code是一堆代码,那么我们很难通过代码去控制界面,老手是可以做到的,我们新手小白先简单的去做这个事情,就是在figure中去设计,这里说一下GUI中非常关键的一个东西,Tag

双击figure中的按钮,找tag这个标签

你要你的程序所出的图,表,如何对应到固定的axes和列表呢,就是这个标签,打个比方,我要把东西给小明,但你不能给小红,所以你要把程序写入这个叫」小明「的组件中去,这样就对应起来了,GUI说到底就是一个程序的启动器

所有的功能,左边的按钮基本上已经涵盖了,我只讲一些我常用的按钮

1.按钮

程序运行后,这个单击,就是一个程序的启动。在figure界面,双击,就是这个按钮的编辑了,比如颜色,背景色,线宽等等,也可以更Tag,更改标签,换一个我们需要的名字。然后我们需要做的就是去关联一段程序

右键点击按钮,callback
callback之后会自动进入这个按钮程序代码

2.按钮组

这个是单选按钮与面板的组合,按钮的对齐可以用自动对齐
多个单选按钮组成一个组,针对组,就需要用这个作为一种回调

按钮组的作用就是可以实现不同的选择,比如不同路况的试验数据,不同温度

3.显示

我的数据要展示,图要显示,那么怎么在GUI中显示呢,就是以下两个按钮

这个是出图的显示界面
表的显示界面

4.下拉菜单

同样是选择不同的项目

点击这个中间按钮增加下拉菜单的项目

好嘞,以上的功能适合大部分简单的GUI设计了,其他的锦上添花的东西,诸君自行琢磨,比如加个开机动画,加个进度条,数据保存到EXCEL,另外多一嘴,MATLAB可以实现与office的互通,我可以用代码将excel的数据导入matlab

两个函数

xlsread,这个函数可以实现excel导入matlab

xlswrite,这个函数实现MTALB数据自动写入excel


注:想在GUI中玩的精,关注一下这个大牛」打浦桥程序员

1.这里上传一下我在那里下载的一个资料,感兴趣的,自行下载哦~

MATLAB GUI电子书.pdf1M · 百度网盘

2.我在学习GUI中收集的一些网站

MATLAB中的单选按钮和按钮组_matlab_永不言弃-CSDN博客?

blog.csdn.net图标https://www.ilovematlab.cn/thread-120650-1-1.html?

www.ilovematlab.cn

https://www.ilovematlab.cn/thread-21726-1-1.html?

www.ilovematlab.cn

MATLAB GUI表格(uitable)的增删操作?

blog.csdn.net图标MATLAB编写GUI小结--动态更改GUI布局、多个面板交替显示_matlab_long_xuan123的博客-CSDN博客?

blog.csdn.net图标

MATLAB设计GUI界面非常简单

1.进入界面设计环境

打开MATLAB,然后再 主页——新建——图形用户界面,选择一个空的GUI界面即可

2.进入编辑界面,拖入各种控制项,开始设计界面

3. 按钮callback

设置按钮属性,保存,在保存的*.m文件中写入执行的代码,即完成了按钮的callback


如果是Matlab GUI设计的初学者,强烈建议阅读《MATLAB GUI设计学习手记(第三版)》。

有需要这本书和书中示例代码的同学可以联系我,或者从下方链接下载:

MATLAB GUI学习秘籍下载?

eyun.baidu.com


刚开始接触gui就是从matlab和python这来的。学py的时候有一个地方是用用个包做gui,虽然又出了很多包,但都感觉很弱(最近不知道咋样了),无意间发现了matlab做gui太容易了,一度沉迷于此,以下列出优劣势:

优势:遇到科学计算方面的实现信手拈来

劣势:生成独立的exe文件体积太夸张的大了,很不方便。对于在含有matlab的机器上运行还好些,可以缩减很多体积,但貌似也有版本等问题,即我写的gui代码拿到另一个机器会报小错。

本来我就不太需要gui这个功能,所以没多久就弃坑了,虽然脑海里产生了一些好玩的想法。

最近又想捡gui起来了,因为了解了C#,初学发现和matlab gui有些像,但更稳定,有vs加成,遇到科学计算的部分,也有成熟的库调用。


更新:

对于c#在科学计算方面的缺陷,可以通过.net平台上的类numpy包弥补。我做了个小东西,有点感受:

随机老化:numSharp+winform制作模拟布朗运动的GUI?

zhuanlan.zhihu.com图标

大些的gui也木问题,生成的exe很小,在win下方便传播。我觉得我找到了最好的解决方案。目前就是对于.net下的类numpy、matplotlib、pandas及众ML包的documents很不完整,但这都是假以时日的事。


一种是在command窗口下输入guide,会弹出引导界面,以拖拽的方式图形化开发界面,简单快捷,重点在于学习如何编写callback以及如何使用handles结构体;还有一种是使用m文件,手撸界面,比较繁琐,个人觉得这种方式相对自由一些,重点在于callback函数编写。

ps:相关资料网上有很多,还有不少视频教程


为什么会刷到这个 可能是最近查MATLAB太多了吧

这个问题有点日子了,现在好像用APP Designer更多,GUI的话,没有APP Designer那么方便简单


matlab gui基于java swing,可以在脚本里写简单的java或者打包好.jar给matlab调用。自带的gui组件基本就是matlab脚本包著java swing,可以看看undocumentedmatlab,解锁隐藏功能哦。还有一个半官方的layout toolbox也不错,方便复杂界面布局,也可作为自己写界面的参考。当然matlab真不适合做重gui的东西,大多数人就guide拖拖控制项吧。以前不得不用matlab手写复杂界面,相当恶心....


做gui用MATLAB可是真糟糕,拖控制项的VB、c#的winform又简单又香。本就是个脚本语言,效率低,还要拿来做界面,真尴尬。


多线程下支持不好,花了半个月全部转到了python。qt可以很好的替代matlab app designer,相同操作逻辑。


推荐阅读:
相关文章