GUI入门实例:一文读懂基本的Matlab的GUI设计方法

先把最重要的东西放前边:
1、GUI本质就是个图窗.fig文件,你保存后,系统后自动生成一个有关这个图窗启动显示的程序框架,一旦生成像文件名这个参数已经固定了,后续要修改相当麻烦,因此命名时想好了,后续要改名直接重命名是不行的,不如重新做个。
2、放置模块时,为了使界面整洁,我们设置的很多模块是相似的,比如大小啊,字体啊,因此明智的做法是先完完整整的设置好一个模块的所有属性(字体、大小,颜色,是否可见等),然后复制粘贴出其他的模块,这样就只需要修改他们不同的属性(比如模块显示的字符串)。
3、全局变量设置在OpeningFcn下,声明格式global 变量名,最后赋值一个初始的值,以后在回调中使用,要改变时,必须再次声明该变量是全局变量,声明格式global 变量名

一、GUI概念
命令行敲 guide,选择打开新建默认空白GUI:
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第1张图片
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第2张图片

放置一个静态文本,双击进入编辑器:
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第3张图片
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第4张图片

这里的选项是按照首字母大小排序的,可以大致把它分为三个属性:回调函数、界面属性和参数属性

界面属性指的是模块的视觉特征:颜色啊、字体啊、位置啊,不多说
需要提一点的是最后的Visible,意思是是否可见,有时候我们可能想要隐藏某个组件,比如图片都是放在坐标区的,但有时候我们的图片是没得坐标的,这时候,你放置坐标区就可以把Visible设置为不可见(off)

回调函数属性都是用于鼠标点击交互的,下边给出常见的回调函数的含义:
callBack
    最常用的就是它。如果控件是按钮,那点击按钮时,则按钮下的Callback就会执行;如果是滑块,则拖动滑块时,滑块名下的callback就会执行;总之,就是对控件默认操作时,matlab后台就会自动调用它名下的的callback。正常用途,全放在callback下就够了。如果其他的,实在是想知道,了解一下也未尝不可。
ButtonDownFcn
    就是鼠标在它(代指各种控件)上面点击一下,你放在这个函数名下的代码就会执行。(ps:按钮的callback也是点击,所以会覆盖掉这个buttondownfcn。)
CreateFcn
    顾名思义,在生成这个控件,显示之前,执行你放在这个函数名下的代码;
DeleteFcn
    一样。在控件要销毁,但是被毁灭之前执行这个函数名下的代码。貌似“真的要退出吗”这一类就是写在这里。
KeyPressFcn
    当前控件获得焦点且有按键按下时执行。(什么是焦点?就是这个控件被鼠标点了(或者是tab轮选到了)。你打开一个记事本,然后再点这个网页,再随便按几个按键,记事本上有字不?没有对吧。因为它没获得焦点,所以你的按键它不会反应的。只有你最后再点它一下,再按几个按键,结果怎么样?有字了吧?)这里的KeyPressFcn也是一样的道理。一般在这下面的代码还会判断下按键是什么,然后执行相应的代码。
SelectionChangeFcn
    在群按钮 组件中,改变选择时,所执行的函数

 参数属性指的的在我们写程序时可能会引用的变量属性。
 比如 Tag,它是组件上显示的字符串,即组件名称,有点界面属性的意思,但是有时候我们又要用到这个属性,比如可编辑文本的Tag:

GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第5张图片
这个可以用来用户填写数值的框是可编辑文本,其余是静态文本,我们后续需要这个编辑的数值
在它的callback下这样写(右键模块,选择回调函数,callback,会进入该程序段):
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第6张图片
handles是整个图窗的结构体名,edit1是模块的Tag属性,即模块名
使用get,就把编辑栏的内容赋值给了t。
然后还有value属性,在单选按钮、弹出式菜单比较常用,表示的选项的序号,比如弹出式菜单,在string内按行依次填入选项名称
在这里插入图片描述
然后要实现这个选择就可以在它的callBack下边写
switch case语句

var=get(handles.popupmenu1,‘value’);
switch var
case 1 …
case 2 …

二、GUI入门实例
有了上面的概念现在来写一个简单GUI
该GUI对应车牌识别系统的程序
车牌识别参见这里
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第7张图片
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第8张图片一个静态文本区、一个坐标区(放置图片),三个按钮
静态文本就是把string编辑下文字,改改字体,颜色啥的
按钮上边的显示也是如此
封面上的图片是在图窗生成是执行的程序OpeningFcn下写的:
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第9张图片

三个按钮功能的实现都放在他们各自的callBack下
图片选择:

[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.png'},'载入图像');
   if isequal(filename,0)||isequal(pathname,0)
      errordlg('没有选中文件','出错');
   return;
   else 
   file=[pathname,filename];
   end
   I = imread(file);
axes(handles.axes1);
imshow(I);
save('I.mat','I')

这里注意到使用了save将图片保存在当前文件目录,便于后续其他图窗使用,详情在下边的GUI参数传递中再讲。
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第10张图片
把图片显示到了封面的坐标区:
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第11张图片
退出,就是在callback下写我们一般的开头三句:
clear
close all
clc

start就是进入下一步,就是一个窗口切换

License=gcf;
Position;
close(License);

gcf是当前图窗的名称Position是要打开的图窗名
close关闭当前图窗

原理其实和之前用figure一样

再写个Position图窗
这里需要注意的是GUI之间的参数传递问题,初学者掌握这两种方法就好:
1、全局变量法 global 变量名
使用global(全局变量)在一个GUI的OpeningFcn下先声明所有的全局变量,然后在回调中再次声明该变量为全局变量,即可在回调中改变改变量的值。这就实现了一个GUI窗口中,不同回调函数、生成函数等之间的参数传递问题。
2、save load法
使用save(‘文件名’,‘变量名’),把变量保存在文件目录下,然后在另一个GUI窗口中,
使用load(文件名’,‘变量名’)),再将数据加载下来,就可实现不同GUI窗口间的参数传递

Position的回调中就执行了load,从而把License窗口中完成的图片选择加载到了Position窗口中

GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第12张图片
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第13张图片
Back切回License
Next 进入图窗 Process,这里同样需要load,save
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第14张图片
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第15张图片
这里需要注意的有两点:
1、字符分割后的结果使用了subplot放在了axes8,多张图片放在一个坐标区时,需要在坐标区下边加一个面板panel,以用来限制图片显示的范围,这里若不加面板,则字符分割结果会占满整个图窗,使得其他坐标区显示被隐藏。
2、Recognition按钮的回调下是字符识别匹配程序,用于字符匹配的字符是上边分割的结果,因此变量分属两个函数,这里就是同一个图窗的参数传递了,使用global来实现。
点击识别:
GUI入门实例:一文读懂基本的Matlab的GUI设计方法_第16张图片
这个识别结果的窗口是matlab自带的,msgbox函数,具体可以help下自己参考

最后总结哈:
**
1、开头的三句很重要
2、基本模块的使用一般是界面属性自个设置,回调函数callback点击执行,参数属性,使用get函数获取,理解好handles这个结构体的概念,tag是标注,即组件名
3、参数传递的两种方法:
一个GUI的不同函数间使用global
不同GUI间的参数传递用save,load
掌握了这三点,GUI其实就是个先放按钮,然后点哪执行哪的callback的程序**

希望大家不吝点赞鸭,么么哒~

你可能感兴趣的:(车牌号自动识别,数字图像处理,GUI,matlab,gui)