在博文《Matlab:学习GUI(一个简单的例子)》(介绍的方法是完全用代码来建立一个GUI,实际上Matlab本身有一个设计GUI的交互系统——GUIDE,用户可以使用该系统更方便的建立自己的GUI.

本文将介绍使用GUIDE时常常遇到的几个问题。本文将通过一个简单的例子来说明问题,读者朋友们可以边看边操作。在command line输入guide回车,打开Layout Editor.建立一个空白的模板(Blank GUI),建立一个push button,将“String”改为“Close”,save并将文件名命名为test,如下图:

save后,Matlab会生成两个文件test.M和test.fig,打开test.M,如下:

functionvarargout = test(varargin)

% Begin initializationcode - DO NOT EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename,...

'gui_Singleton',  gui_Singleton,...

'gui_OpeningFcn', @test_OpeningFcn,...

'gui_OutputFcn',  @test_OutputFcn,...

'gui_LayoutFcn',  [] ,...

'gui_Callback',   []);

ifnargin && ischar(varargin{1})

gui_State.gui_Callback =str2func(varargin{1});

end

ifnargout

[varargout{1:nargout}] =gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

% End initialization code- DO NOT EDIT

% --- Executes justbefore test is made visible.

functiontest_OpeningFcn(hObject,eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);

% --- Outputs from thisfunction are returned to the command line.

functionvarargout = test_OutputFcn(hObject,eventdata, handles)

varargout{1} = handles.output;

% --- Executes on buttonpress in pushbutton1.

functionpushbutton1_Callback(hObject,eventdata, handles)

生成的M文件的结构主要由三个子函数构成:_OpeningFcn,这个函数是在GUI界面出现以前Matlab在后台运行的,GUI设计者可以在这个函数内完成数据初始化设置、GUI的界面的控制和调整等工作。_OutputFcn函数是M文件最后运行的函数,主要是为了输出运行结果。_Callback函数用于控制component的触发行为,比如说用户按下界面的按钮后,该按钮应该执行什么命令。我们这个例子设计的是按下“Close”按钮后,GUI界面关闭,因此需要在

functionpushbutton1_Callback(hObject, eventdata, handles)

后面加上:

delete(handles.figure1);

下面我们开始借助这个简单的例子,讲一讲新手在应用GUIDE时常见的三个问题:

问题一:figure Name和figure tag弄混了。

Figure Name指的是M文件和Fig文件的name,即本例中的test. Tag指的是设计GUI界面时为每个component所指定的标签,也是程序中唯一的可以识别component的名字,GUI的面板也是一个component,有自己的tag,即本例中默认的figure1.弄混figure tag和figure name的例子如下:

错误代码:

functionpushbutton1_Callback(hObject, eventdata, handles)

delete(handles.test);

当运行错误代码时,Matlab会提示找不到handles中的test变量,因为handles只是存储component的句柄,每个句柄是以tag来命名的:

??? Reference to non-existentfield 'test'.

Error in ==>test>pushbutton1_Callback at 81

delete(handles.test);

问题二:uiwait在逻辑上与uiresume不配对。

还是上面的例子,如果再增加一个功能,等用户按下“Close”按钮后,在屏幕输出“OK”,否则不输出。为实现该功能,在test_OpeningFcn的guidata语句后增加:

% UIWAIT makes test waitfor user response (see UIRESUME)

uiwait(handles.figure1);

在test_OutputFcn的varargout{1}语句后添加:

delete(handles.figure1);

将pushbutton1_Callback中的delete(handles.figure1)删除,并添加:

disp('OK');

uiresume(handles.figure1);

运行后,用户点击“Close”按钮,一切正常。可是,当用户不点击“Close”而是直接关闭窗口时,程序提示OutputFcn输出错误:

出现该错误的原因是:当用户直接关闭窗口时,所有在内存中的变量都被清楚,程序在执行到OutputFcn是已没有变量可以赋值给结构变量varargout{1}了。为了改正该错误,需要添加_CloseRequestFcn函数:

% Executes when userattempts to close figure1.

functionfigure1_CloseRequestFcn(hObject, eventdata, handles)

% hObject    handle to figure1 (see GCBO)

% eventdata  reserved - to be defined in a future versionof MATLAB

% handles    structure with handles and user data (seeGUIDATA)

ifisequal(get(hObject,'waitstatus'),'waiting')

% TheGUI is still in UIWAIT, us UIRESUME

uiresume(hObject);

else

% TheGUI is no longer waiting, just close it

delete(hObject);

end

可是,如果直接将上述代码复制到test.m文件中,保存,运行,关闭窗口时,同样会出现上述OutputFcn输出错误,这个就涉及到下面第三个问题。

问题三:Layout Editor的设置和M文件不同步。

为解决上述问题,可打开figure1的Property Inspector,注意到CloseRequestFcn一栏,显示的是closereq,点击以下旁边的图片,变为:

这说明两者已经同步,此时可以放心的运行程序了。

转载本文请联系原作者获取授权,同时请注明本文来自刘磊科学网博客。

收藏

分享

分享到:

文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...相关推荐

  1. 音频剪切matlab,科学网—matlab的音频处理:读取,裁剪,输出和命名 - 张智昊的博文...

    网易云下架了周杰伦的几乎所有歌曲,于是尝试下载一套周杰伦的音乐全集.从微盘上下载到的音乐前面有一段奇葩的广告,长约8秒.因为广告长度一样可以轻松的裁剪处理,于是想到可以用matlab写一个简单的小程序 ...

  2. 主成分回归预测matlab,科学网—Matlab: princomp() 主成分分析 - 杨建功的博文

    Matlab 提供了进行主成分分析的函数 princomp().由于主成分分析(principile component analysis,PCA)这个概念在不同领域(统计学.数学等)的解释差异较大, ...

  3. 极大似然函数 matlab,科学网—matlab实现:基于极大似然估计的混合分布参数估计(LM洪峰流量) - 曾杭的博文...

    这个是无错误版~ clear; clc; load('test.mat'); test = A_pastespecial; c2 = test(1:32,:);%前半部分数据 c3 = test(33 ...

  4. gshhs matlab,科学网—Matlab 利用m_map加国界线 - 肖鑫的博文

    首先要添加m_gshhs工具包,在private文件夹下下载好岸线数据,具体请参考m_map工具包官网 在m_gshhs.m下,告诉我们如何加入国界 function m_gshhs(resoluti ...

  5. shiftdim matlab,科学网—matlab函数(矩阵相关) - 黄妮妮的博文

    matlab函数(矩阵相关) functions frequently used in matlab in respect of matrix Elementary matrices. zeros   ...

  6. 邹检验 matlab,科学网—Matlab中一个很有用的函数:regionprops - 邹兴文的博文

    Matlab中一个很有用的函数:regionprops 已有 6712 次阅读 2010-1-30 22:52 |个人分类:开发经验|系统分类:科研笔记| 有用的函数, regionprops Mat ...

  7. 微波matlab,科学网—matlab风云3号卫星微波数据读取 - 彭邦的博文

    之前自己在读取风云3号数据时候,各种查资料都没有找到相关的内容,后来自己慢慢摸索终于将数据读了出来,虽然方法很笨,但是算是达到了基本效果吧.给自己记录下,也分享给大家. 中间值得注意的是我读取的是风云 ...

  8. html文本框自动赋值,js给文本框赋值 value与innerHTML

    赋值操作: document.getElementById("testId").value="hello"; value与innerHTML的区别 上面的val ...

  9. 原生js赋值html,原生js文本框赋值点击文字给text文本框赋值表单提交

    特效描述:文本框赋值 文本框赋值表单 表单提交. 代码结构 1. HTML代码 菜单导航 时间日期 焦点图 tab标签 jquery特效 在线客服 官网 js代码 var x=["菜单导航& ...

最新文章

  1. rpm包 卸载php,强制删除rpm包的方法
  2. android-ViewPager不能显示
  3. 25岁“天才少年”曹原再发一篇Nature!1个月时间内的第二篇!
  4. 算法基础知识(考试复习)
  5. 复杂场景下,如何用AI技术做地图?
  6. 前端开发的模块化和组件化的定义,以及两者的关系?
  7. 速腾聚创三维激光雷达 实现cartographer 建图复现工作(代完成)
  8. [宋史学习] 赵光义篡改历史
  9. IP-guard23个功能模块简介
  10. svn环境搭建 linux
  11. 家用路由器的相关知识和功能
  12. 半导体器件物理【1】量子理论扫盲——从Planck到态叠加原理
  13. 新员工特训营-MAG网络安全(关联转正考试:网络安全考试)
  14. c语言滚动字幕的原理编程,c#中通过Graphics.DrawString实现滚动字幕的原理和代码实例...
  15. Android开发框架汇总
  16. 【BZOJ4864】【BJWC2017】神秘物质 - Splay
  17. 我的世界联机教程java_我的世界(minecraft)联机教程
  18. 制作一个网页背单词系统
  19. 口腔医学院用学计算机吗,口腔医学专业VS计算机专业,同样高考志愿大热门,我该选择哪个?...
  20. 强大的Shell客户端-推荐

热门文章

  1. linux网络编程之用select函数实现io复用(基于TCP)引发的思考
  2. Android之用netcfg命令获取手机虚拟网卡tun0的信息
  3. linux c之用fwrite和fread实现文件的复制
  4. 从行驶的车上向上抛球,球真的会回到原地吗?
  5. 博古通今的孩子是怎么养成的?答案就在这本影响了无数中国人思想的奇书里……
  6. 霍金竟然亲口承认自己是个赌徒!明明失败了不止一次,“菜鸡”却成了神话!...
  7. 我的电脑不联网,很安全!黑客:你还有风扇呢
  8. 百万大奖参赛攻略 | 让程序员走向财富自由
  9. linux mint 用户管理,Linux Mint 新工具:将网站转变为独立的应用
  10. c语言md5函数 linux,Linux下C语言计算文件的md5值(长度32)