《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 266385|回复: 590
收起左侧

[教程] GUI指导教程系列(1):GUI入门基本操作

    [复制链接]
发表于 2010-2-27 13:58:45 | 显示全部楼层 |阅读模式
为什么在MATLAB中要使用GUI呢?其实GUI就是Matlab中的Visual Basic,是面向对象的编程,可以使Matlab程序的终端用户,即使不懂的Matlab也可以轻易操作该程序!

如果没有图形用户界面(GUI)我们只能从命令行(Command Window)中调用相关程序,这相对比较繁琐,并且不是所有用户都是这个能力。就好比计算机的DOS系统,在有windows的情况下,您会选择DOS吗?当然我们也不排除骨灰级的人物!

在本节教程我们主要针对没有GUI创建和使用经历的网友,但是必要的MATLAB基础知识是需要的。在教程中我们将创建一个简单的GUI程序,它执行两个数的加法运行,然后显示其运算结果。

image067.png

什么Matlab还没有安装?天呀,那请您先看下论坛的【MATLAB下载安装】版块(最新版本2009b,4.75GB),里面有您在Matlab下载安装过程中需要的一些资料!


好下面开始我们的教程!

一、打开和创建GUI界面

1、首先打开Matlab,在Command Window中输入guide回车

image003.png

当然也可以通过工具栏的GUIDE按钮直接打开

image004.png

2、此时打开GUI编辑器GUIDE(GUI Developer的缩写)

2.1 界面上有两个标签也“Creat New GUI”和“Open Existing GUI”
如果创建新的GUI此时我们选择第一个标签页,但如果打开其它已经存在的GUI就点击第二个标签吧

2.2 这里我们选择第一个标签下的“Blank GUI”(空白GUI),下面还有几个系统GUI模版,你可以根据需要其它的

image005.png

2.3 点击“OK”我们正式进入GUIDE界面,呵呵,是不是感觉似曾相识

image007.png

3、添加你需要的控件到figure中

在添加控件之前,您最好对您的GUI界面布局已经有一定的构思了,否则盲目性太大了不利于您的编程。下面是我们构思的布局

image009.png

评分

参与人数 2威望 +11 贝壳 +11 贡献 +10 收起 理由
gcunshan + 1 + 1
zhenghui + 10 + 10 + 10 谢谢校长!

查看全部评分

发表于 2010-4-29 15:50:56 | 显示全部楼层
校长,我按照你给的步骤做出来和直接下载你的程序运行出来都是同样的错误,如下
??? Attempt to reference field of non-structure array.

Error in ==> myAdder>add_pushbutton_Callback at 134
a = get(handles.input1_editText,'String');

Error in ==> gui_mainfcn at 75
        feval(varargin{:});

Error in ==> myAdder at 42
    gui_mainfcn(gui_State, varargin{:});

??? Error while evaluating uicontrol Callback.

评分

参与人数 1贝壳 +1 收起 理由
aicaller + 1 你说的对,我做了两遍也还是错误的,运行不 ...

查看全部评分

 楼主| 发表于 2010-2-27 15:24:23 | 显示全部楼层
五、程序常见问题(bug)解答

如果你的GUI程序没有正确运行,或者频频报错,而苦于没法找到错误在哪里,这里有几条小技巧希望能帮助您找到bug。

1、如果是语法错误,Command Window中会以命令行的形式告诉您bug所在的文件、行号,以及简短的错误描述,当然摆平这样的bug你必要有一定Matlab基础。

2、确保您的变量名在整个代码中前后一致,注意大小写,否则不小心敲错的字母。同理控件的tag属性在.fig和.m文件中必须同步,比如说你要获取tag为input1_editText的编辑文本框的string,此时一定注意要与代码中tag一致,即就是如下所示
  1. a = get(handles.input1_editText,'String');
复制代码
这一条特别是在你重新修改某个控件的tag之后尤为值得注意。

3、在code中适当设置断点,程序运行到断点的时候会暂停,此时我们可以方便的获取程序中的中间变量值,这是一个不错的调试方法,也是最经常用到的。(断点如何设置?在代码左边行号旁边点击下就设置了一个断点了)

4、整个GUI程序的代码可以到这里下载 GUI_beginner.zip (4.52 KB, 下载次数: 2697)
发表于 2015-9-6 15:13:29 | 显示全部楼层
赞一个  新手学习很有效  楼主辛苦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-27 14:34:12 | 显示全部楼层
二、添加控件和设置属性

在正式讲解之前,我们先讲解下GUI中的鼠标基本操作

(a) 在左边的控件面板中鼠标左击选择您需要的控件,然后放开鼠标
(b) 在右边的figure中按住左键,画出您的控件,于是空间就在figure上
(c) 你可以用鼠标拖拽figure上所有控件,来改变他们的位置
(d) 在控件上双击鼠标左键(右击是快捷菜单)可打开控件属性面板

1、从上面的布局构思,我们知道本GUI需要以下控件

edit-icon.png :两个“编辑文本框”(Edit Text)
static-icon.png :四个“静态文本框”(Static Text)
pushbutton-icon.png :一个“确定按钮”(Pushbutton)

按照上面介绍的鼠标操作方法,将这6个控件拖到右边的figure中,如下图所示

image037.png

2、接下来就是编辑这些控件的属性

好,下面从Static Text开始吧,双击其中一个“静态文本块”,将跳出该控件的“属性查看器”(Property Inspector)

image039.png

GUI控件的几个常用属性说明如下:

position:指示空间在figure中的位置
font**:字体相关属性
string:相当如VB中的caption,就是显示在控件上的文字
tag:控件的唯一标识符,相当于ID,我们需要tag来指定某一个空间

2.1 在这里我们修改它的“string”属性为“+”

image041.png

2.2 同理修改它的“fontsize”属性为20
在编辑完这些属性后,直接点击右上角的“关闭”按钮,关闭属性查看器,此时属性会自动保存。回到GUIDE,如果控件上的文字被部分隐盖,此时可以通过鼠标拖拽改变控件的大小

2.3 重复上面的操作
(1)将第二个“Static Text”的“string”改为“=”,“fontsize”为20
(2)第三个“Static Text”的“string”改为“My Adder GUI”,“fontsize”为20
(3)第四个“Static Text”的“string”改为“0”,“tag”为“answer_staticText”

image045.png

于是,我们将得到如下所示的GUI界面

image047.png

2.4 下面双击Edit Text,修改编辑文本框的属性
(1)第一个“Edit Text”的用来存储第一个加数,我们将“string”改为“0”,“tag”改为“input1_editText”

image049.png

(2)第二个“Edit Text”的用来存储第二个加数,我们将“string”改为“0”,“tag”改为“input2_editText”

2.5 修改Pushbutton按钮的属性,“string”改为“Add!”,“tag”改为“add_pushbutton”

image051.png

再次预览下我们现在得到的GUI界面

image053.png

3、重新布局和移动控件位置,使其美观

image055.png

将上面编辑完的GUI程序保存为myAdder,此时在当前目录下,Matlab将自动生成如下来个两个文件myAdder.m和myAdder.fig。

.fig文件包含了程序的图形用户界面,.m文中包含了GUI所需的回调函数和其他必须代码。
 楼主| 发表于 2010-2-27 15:19:10 | 显示全部楼层
三、书写GUI回调函数(callback)代码

在保存GUI程序时,Matlab会自动生成.fig和.m文件,其中的.m就是我们现在要操作的对象。

我们就是M文件中添加控件的回调函数相应用户的操作!这也是GUI编程的核心内容,它要求你必须掌握Matlab基本编程以及图形句柄语句!

打开.m文件,发现里面有很多function的代码,看得我们眼花缭乱,呵呵,不要胆怯!本教程是初级教程, 我们只涉及里面的callback,其他的我们可以暂时置之不理!至于其它的我们以后的教程中对做相关介绍!

在正式讲解之前,一个小使用技巧,Matlab Editor(代码编辑器)工具栏显示函数按钮 fx.png ,可以让我们快速跳转我们需要的函数位置!这个在.m内容很多的时候很有用哦!

1、在Editor中工具栏的函数Show Function中选择input1_editText_Callback

fx2.png

或者右击tag为input1_editText的编辑文本框,View Callback→Callback

viewcallback.png

2、此时光标会跳转到.m文件的function input1_editText_Callback处,方便我们直接编辑
  1. function input1_editText_Callback(hObject, eventdata, handles)
  2. % hObject    handle to input1_editText (see GCBO)
  3. % eventdata  reserved - to be defined in a future version of MATLAB
  4. % handles    structure with handles and user data (see GUIDATA)

  5. % Hint: get(hObject,'String') returns contents of input1_editText as text
  6. %        str2double(get(hObject,'String')) returns contents of
  7. %        input1_editText as a double
复制代码
在上面代码下添加如下MATLAB代码

  1. % handles 包含figure中所有图形对象句柄的结构体,如果我们想引用tag为mytag的控件,使用handles.mytag
  2. % set/get 函数是用来设置/获取某个控件属性
  3. % 使用get命令获取第一个加数,并将它转换成数值
  4. input = str2num(get(hObject,'String')); % string属性是字符串,所以必须转换成数值

  5. % 检验输入是否为空,是则将它置为0
  6. if (isempty(input))
  7.      set(hObject,'String','0')
  8. end

  9. % 保存handles结构体,只要在handles结构体有改变时,才需要保存
  10. guidata(hObject, handles); % 这里由于handles没有改变,故这里其实没有必要,但是为了避免潜在的不必要麻烦,建议在所有Callback最后都添加该命令
复制代码
3、为input2_editText_Callback添加完全相同的代码

4、编辑add_pushbutton_Callback回调函数,使用上面提到的方法,将光标定位到
  1. % --- Executes on button press in add_pushbutton.
  2. function add_pushbutton_Callback(hObject, eventdata, handles)
  3. % hObject    handle to add_pushbutton (see GCBO)
  4. % eventdata  reserved - to be defined in a future version of MATLAB
  5. % handles    structure with handles and user data (see GUIDATA)
复制代码
在后面我们添加上如下代码
  1. a = get(handles.input1_editText,'String');
  2. b = get(handles.input2_editText,'String');
  3. % a和b是字符串变量,我们需要使用str2double函数将其转换为数值
  4. % 然后才能相加,否则字符串是没法相加的
  5. total = str2num(a) + str2num(b);  % 格式转换,转换为数值
  6. % 由于string属性是字符串,所以必须将两个数的和转换为字符串
  7. c = num2str(total); % 转换为字符串
  8. %  将结果赋值给answer_staticText空间的string属性,于是就可以显示结果了
  9. set(handles.answer_staticText,'String',c);
  10. guidata(hObject, handles); % 更新结构体
复制代码
恭喜您,到此为此这个GUI程序就完成了!接下来就可以运行和演示它了!


有一个小技巧要告诉大家的,如果您在第一次保存GUI程序时,不想让Matlab为每一个callback回调函数自动生成注释文本,可以如下操作:File→Preferences...

prefer.png

如果不想让Matlab自动生成fig文件,而只是生成M文件,可以如下操作:Tools→GUI Option

guoptions.png
 楼主| 发表于 2010-2-27 15:23:59 | 显示全部楼层
四、GUI程序打开、运行和发布

1、想在GUIDE中打开一个写好的GUI程序,可有两种方法

1.1 如上面所说的,在打开GUIDE界面时,我们可以选择“Open Existing GUI”,然后选中你需要打开的GUI程序

open.png

1.2 直接在Current Directory选中*.fig文件,然后右击选择“Open In GUIDE”

open2.png


2、运行编辑好的GUI程序方法主要有三种方法

2.1 点击GUIDE工具栏的run按钮 guide_play.png ,如下图所示

image062.png

2.2 从Command Window命令行运行,首先将MATLAB当前目录切换到*.fig和*.m文件所在目录(两个必须同在当前目录或者都在搜索路径下)

image063.png

接着在Command Window中输入GUI的文件名(不需要扩展名)myAdder,然后回车

image065.png

2.3 直接在Current Directory中选中myAdder.m,右击选择“Run File”即可

通过上面三种方法中任意一种,GUI程序将开始运行,并显示如下


image067.png

3、执行GUI程序功能

在两个文本框中输入分别输入两个加数,然后点击Add!按钮,此时和将显示在“=”右边的文本框中!
发表于 2010-2-28 13:21:12 | 显示全部楼层
楼主辛苦了,造福Matlab初学者呀

_handshake_ 回复 5# dynamic
发表于 2010-2-28 13:42:54 | 显示全部楼层
编写一本教程是很辛苦的,感谢校长,大家共同学习!
发表于 2010-3-9 11:03:14 | 显示全部楼层
发表于 2010-3-12 19:25:04 | 显示全部楼层
校长你这样不停的眨眼,我真的很晕啊:dizzy:
发表于 2010-3-18 09:00:53 | 显示全部楼层
谢谢楼主,学习了,支持
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号-2 

GMT+8, 2021-9-24 08:54 , Processed in 0.060142 second(s), 14 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表