MATLAB GUI数据传递总结
MATLAB GUI的总结

初学MATLAB GUI,感觉这篇博文总结的比较好,易于上手,故转来,全文如下:创建Matlab GUI界面通常有两种方式:1,使用 .m 文件直接动态添加控件2. 使用GUIDE 快速的生成GUI界面显然第二种可视化编辑方法算更适合写大型程序。
一:创建GUI1.在.m文件中动态添加例如h_main=figure(‘name’,‘a demo of gui design’,‘menubar’,‘none’,…'numbertitle','off','position',[100 100 300 100]);h_edit=uicontrol('style','edit','backgroundcolor',[1 1 1],'position',[20 20 50 20],...'tag','myedit','string','1','horizontalalignment','left');h_but1=uicontrol('style','pushbutton','position',[20 50 50 20],'string','INC',...'callback',['v=(get(h_edit,''string''));',...'set(h_edit,''string'',int2str(v+1));']);h_but2=uicontrol('style','pushbutton','position',[80 50 50 20],'string','DEC',...'callback',['v=(get(h_edit,''string''));','set(h_edit,''string'',int2str(v-1));']);2.使用GUIDE帮助创建GUI在Command 里面输入GUIDE 或者从菜单里面,或者从快捷按钮均可进入GUIDE新建并且保存后,会生成相应的fig文件和m文件,在Layout编辑视图,可以使用如下工具:Layout Editor:布局编辑器;Alignment Tool:对齐工具;Property Inspector:对象属性观察器;Object Browser:对象浏览器;Menu Editor:菜单编辑器。
MATLAB GUI编程技巧汇编

GUI编程技巧汇编/forum/forum-19-105.html 1. 如何使gui编的界面一运行就居中?方法一:a>假如当前的figure的句柄是h,则在程序运行的刚开始,用这个命令,set(h,'visible','off'); %使h对应的图不可见.b> 然后你再进行你的其它的操作,c>最后,在程序的结尾部分,用这两个语句:movegui(h,'center'); %将这个图移到中央.详细用法参阅help moveguiset(h,'visible','on'); %恢复其可见性.方法二:function figureMiddledfigure;set(0,'units','pixels');set(gcf,'units','pixels');screenrect=get(0,'screensize');screenwidth=screenrect(3);screenheight=screenrect(4);figwidth=600;figheight=200;figposition=[(screenwidth/2-figwidth/2) ...(screenheight/2-figheight/2)...figwidth figheight];set(gcf,'position',figposition);2. 有关GUI实时显示的问题首先,用MATLAB做实时显示其效果并不是很好,主要原因就是它的速度慢,尤其是你的程序中出现循环时,速度更慢.前几天,我也做了一个实时显示的东西,我的做法如下:1.建立一个图,如h=plot(x,y);set(h,'erasemode','xor') %设置擦除方式.2.建立一个死循环,不断的接受数据,并且不断的更新x,y3. 用这个指令set(h,'xdata',x,'ydata',y) ,使x,y的数据不断的得到更新.4.用屏幕刷新指令drawnow进行刷新.就这个方法就可以做到实时了.3.关于参数传递关于参数传递主要有三种方法:1). 就是用定义全局变量的方法来实现,如global a,等这种用法,这种一般用在小程序中,因为如果全局变量太多的话,会造成系统混乱.2). 应用对象的userdata属性,直接通过对象的userdata属性来进行各个callback之间的数据存取操作.首先把数据存到一个特定的对象中,然后在取出来,如下:>> set( 'ui_handle','userdata',value)>>value=get('ui_handle','userdata')这种方法虽然简单,但是缺点是每个对象只能存取一个变量值.3). 利用setappdata,getappdata,rmappdata函数来实现,这几个函数来进行数据传递是最有弹性的.使用方法和第二种方法类似.4.怎么直接将下面一段.txt格式导到MATLAB中?用load命令load e:\data\ccc.txt;我的文件是e盘data下的其实还有一个方法可以导入,有没有试过textread呢5.函数结构与参数传递1)最近简单整理了一下发过的东西,将大家比较困惑的两个问题,再强调一下。
matlab与UG数据交换

Matlab与UG/Pro E 之间的数据交换方法为了充分利用各种软件的优点,经常需要在不同软件之间进行数据传递。
由于NURBS曲线已成为CAD领域的标准,而MATLAB具有强大的数值计算功能。
如果数据能在MATLAB与常见的CAD软件传递,可以很大程度提高设计、计算效率。
在经过尝试后,实现了MATLAB与UG\Proe之间数据的双向传递,在此分享出来,供有需要的参考。
一三维模型导入到MATLAB不同的三维模型软件之间为了交换数据,美国某协会规定了目前三维软件之间一种通用的数据存储格式STL ,对各种三维软件,生成STL文件是很简单的,现以UG和ProE分别说明。
对UG这里输出类型选择文本,因为后面MATLAB读取数据的程序是按照文本形式读取的。
其余选项可以自己设置。
注意!!UG的文件保存路径不能含有中文!!!!!对ProEStep1 :点文件——保存副本Step2 :在类型中,选择stlStep 3 在导出STL对话框中选择ASCII导出格式,其他诸如弦高好像是越大越好2 MATLAB读取STL数据STL格式规定模型由三个顶点组成的小三角形面片,多个面片构成了各种形状的曲面。
因此数据格式如下:首先给出的是一个三角形面片的法向量(x,y,z):facet normal。
然后给出三个顶点vertex。
一个面片就确定了。
读取程序就是要读取facet normal和vertex的内容。
具体见附件中的ReadSTL.m文件。
facet normal +0.0000000E+00 +0.0000000E+00 +1.0000000E+00outer loopvertex -1.7387080E+02 -1.7447189E+02 +2.5000000E+01vertex -2.2559979E+00 -1.2384968E+02 +2.5000000E+01vertex +6.1819200E+00 -1.1596921E+02 +2.5000000E+01endloopendfacet二MATLAB输出数据到UGUG可以根据外部点来画出图像。
MATLABGUI不同控件函数间变量传递方法

MATLABGUI不同控件函数间变量传递方法在MATLABGUI中,不同控件之间可以通过多种方法进行变量传递。
下面将介绍几种常见的方法:1. 全局变量(Global Variable):这是一种简单而直接的变量传递方法。
在MATLAB程序中定义一个全局变量,并在各个函数中使用它。
例如,在GUI的主回调函数中定义一个全局变量,并在其他的控件函数中使用它。
但是,使用全局变量会导致代码的可读性和可维护性下降,并且容易产生命名冲突。
2. 数据导入和导出(Import and Export Data):将数据保存在磁盘上的文件中,然后在不同的控件函数中读取和写入这个文件。
例如,可以将数据保存为MAT文件或者文本文件,并在各个函数中使用load和save等函数进行读写操作。
这种方法的优点是简单易懂,但是频繁的文件读写操作可能会降低程序的效率。
3. 句柄传递(Handle Passing):将一个控件的句柄作为参数传递给其他控件函数,从而在不同的函数中共享变量。
句柄是MATLAB中用来表示图形对象的引用,可以通过函数get和set等来读写对象的属性。
例如,可以通过get函数获取一个控件的句柄,然后将它作为参数传递给另一个控件函数,在该函数中使用set函数来修改该控件的属性。
这种方法的优点是简洁高效,但是需要对MATLAB图形编程有一定的了解。
4. 事件驱动(Event-driven):利用控件的事件回调函数来进行变量传递。
例如,在一个按钮的回调函数中,可以将一些变量的值设为按钮的状态,然后在其他控件的回调函数中读取该变量的值。
这种方法是一种典型的事件驱动编程,可以应对复杂的用户交互操作。
5. 句柄界面(Handle Interface):在GUI的主回调函数中,定义一个句柄结构体,用来存储各个控件的句柄和相关变量。
然后,将该句柄结构体传递给其他控件函数,在这些函数中通过句柄结构体来访问和修改所需的变量。
这种方法可以很好地解决不同控件之间的变量传递问题,并且方便扩展和维护。
GUI多界面数据传递

专题8 GUI对象之间的数据传递【例6.3.1】设计两个GUI界面,分别如图6.51所示:图6.51 例6.3.1图要求:(1)双击主界面的选项,将该选项文本传递到次界面的可编辑文本框中显示出来,并隐藏主界面;(2)点击次界面的【返回】按钮,隐藏次界面,显示主界面。
【解析】创建GUI窗口mainfig,或得到已存在的GUI窗口mainfig的句柄,可使用下列语句:h = figure(mainfig);窗口之间的相互操作,可以采用global函数传递数据,采用findobj或findall函数获取其它窗口对象的句柄,采用mat文件传递数据,采用输入参数传递数据,还可以采用输出参数与uiwat、uiresume组合使用的方式传递数据。
本例采用上述5种方法分别编写对应的回调函数。
步骤:①打开GUIDE编辑器,创建两个GUI,如图6.52所示。
图6.52 例6.3.1的GUIDE布局②设置主界面的对象属性:a)figureName→主界面;b)List BoxFontSize→10;String→张三—(回车)—李四—(回车)—王五—(回车)—孙六;Tag→listbox1。
③设置次界面的对象属性:a)figureName→次界面。
b)Edit TextFontSize→10;String→空字符串;Tag→edit1。
c)Push ButtonFontSize→10;String→返回。
④编写回调函数。
方法1:采用global函数传递数据。
a)主界面List Box的Callback函数为:%% 若双击左键,将所选中的选项文本传给次界面global str;if isequal(get(gcf,'SelectionType'),'open')n = get(hObject,'value'); %获取所选中选项的索引号str_all = get(hObject,'string'); %得到列表框的所有文本str = str_all{n};set(gcf, 'Visible', 'off'); %隐藏主界面nextfig('Visible', 'on');endb)次界面OpeningFcn函数为:handles.output = hObject;%% 以下为添加的代码global strset(handles.edit1, 'String', str);%% 以上为添加的代码guidata(hObject, handles);c)次界面Push Button的Callback函数为:%% 隐藏次界面,显示主界面set(gcf, 'Visible', 'off');mainfig('Visible', 'on');方法2:采用findall函数传递数据。
Matlab GUI 编程心得

Matlab GUI编程心得一、GUI背景制作在Fcn函数内添加代码:ha=axes('units','normalized','position',[0 0 1 1]);uistack(ha,'top') %改变对象顺序II=imread('禾木01.bmp');image(II)colormap grayset(ha,'handlevisibility','off','visible','off');二、GUI中按钮、工具栏按钮添加图片改变button属性中CData值为图片:II=imread('禾木01.bmp');Set(handles.pushbutton1,’CData’,II);%imresize()可以改变图像大小三、GUI内与GUI间数据的数据传递GUI内部数据传递可以通过:handles.a=a1;handles.b=b1;或通过结构体:handles.c=struct{‘c1’,v1,’c2’,v2,’c3’,v3};然后利用handles.c.c1进行数据传递;GUI之间的数据传递:可以利用GUI本身的输入输出进行数据传递。
比如要实现[out1,out2]=GUI(in1,in2)-GUI 为GUI的名字(函数名),可以在OpenningFcn中添加handles.in1=varargin{1};handles.in2=varargin{2};guidata(hObject,handles);并在末尾添加uiwait(handles.figure1);%figure1为子GUI界面的句柄然后在OutputFcn中添加varargout{2}=handles.out1;varargout{3}=handles.out2;delete(handles.figure1); %delete函数不能乱放,在有输出参数时一定要放在程序运行的末尾,即OutputFcn中(没有输出参数时可以放在其他地方)。
MatlabGUI实验报告

实验名称: Matlab GUI设计一、实验题目:自行设计一个GUI界面,在界面中描绘函数的图像。
基本要求:1)可以通过按钮,动态让该图像旋转起来2)可以通过输入文本框,控制该图像旋转的时间二、实验内容描绘函数:x=-10:0.1:10;y=-10:0.1:10;[xx,yy]=meshgrid(x,y);zz=sin(sqrt(xx.*xx.*xx+yy.*yy)).\sqrt(xx.*xx.*xx+yy.*yy); plot3(xx,yy,zz);旋转函数(1):axis vis3dshading facetedfor i=1:36camorbit(10,0,'camera')M=getframe(gcf);End旋转函数(2):for i=1:36camorbit(10,0)drawnowend控制时间函数:a=get(handles.txt,'String');t=2.*str2double(a);按钮修饰函数:I=imread('1.jpg');set(handles.pushbutton1,'cdata',I);I=imread('1.jpg');set(handles.pushbutton2,'cdata',I);附加功能(输出gif文件,可用于ppt)nn=frame2im(M);[nn,cm]=rgb2ind(nn,256);if i==1imwrite(nn,cm,'out.gif','gif','LoopCount',inf,'DelayTime',0.1);elseimwrite(nn,cm,‘out.gif’,‘gif’,‘WriteMode’,‘append’,‘DelayTime’,0.1); endGUI设计界面:三、实验分工:负责旋转函数,描绘函数,输出gif文件函数及GUI界面的设计执行,编写整理实验报告。
阿英讲多个matlabgui之间的数据传递

阿英讲多个matlabgui之间的数据传递1 为什么要多个GUI之间参数传递?在matlab编写GUI界面时候,我们要很多个界面,例如figA和figB,figA中的一个按钮来打开figB,当需要在figB中设置一些参数,然后把那些参数值返回给figA中的按钮的那个callback,以在figA中使用figB传过来的数据。
"为了这个整了好几天头都了。
今天终于看到希望了哈哈,做个备注。
" ------ 首先感谢原作者无私分享他的知识,是你节省了我的学习时间。
2 缘起昨天在网上看了好多帖子,好多前辈都是把他成功的经验分享了一下,没有给具体的多个GUI之间数据传递的例子,或者举的例子没有详细的说明核心的参数传递机制。
这给初学者带来了学习的瓶颈,增加了入门难度。
此文的宗旨在于详细介绍多GUI之间数据传递的原理,结合实际例子深入浅出的把GUI参数传递的方法教给需要这方面知识的人。
愿大家得大智慧,发无上心!3 正文依次实践了下网上流传的多个GUI之间数据传递方式,我个人感觉好用的由以下三种方案,同时也推荐大家在实际的项目中使用,因为根据软件工程的思想不会影响整个工程的质量。
下面依次介绍(1)思想:采用setappdata, getappdata 在子GUI中传递数据,通过 varargout 将子GUI的参数传递给主GUI,uiwait(指定句柄), 通过uiresume(指定句柄)返回OutputFcn。
方法:1)主GUI中放一个Button,无参数调用子GUI,其CallBack如下function pushbutton1_Callback(hObject, eventdata, handles) mySettings = Gui2;set(handles.text1,'string',mySettings.weight)2)子GUI的figure的tag为figB,设置GUI子程序的OpeningFcn函数的结尾加上uiwait(handles.figB),这是因为在子GUI的OpenFcn中,如果不加uiwait,程序会直接运行到下面,执行OutputFcn。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab的GUI参数传递方式总结其实Matlab提供了很多种直接或间接方法实现多fig中的数据共享,只是大家没有注意罢了:1、全局变量2、作为函数的参数传递3、利用控件的userdata数据4、为handles结构体添加新字段5、setappdata函数为句柄添加数据6、跨空间计算evalin和赋值assignin7、将数据保存到文件,需要时读取8、带参数调用GUI的M文件9、嵌套函数(不适用于GUIDE中,只适用纯命令是的GUI)一、全局变量运用global定义全局变量传递参数,适用于gui内控件间以及不同gui间。
这种方式恐怕是最简单的方式,是很省心!但是,简单的问题就在于有时你会很头疼!因为在每一个要到该全局变量的地方,你都要添一句gloal x,还有就是如果你在一个地方修改了x的值,那么所有x的值就都变了!有的时候恐怕会出现紊乱。
另一个更重要的问题在于,套用C++的一句话,全局变量破坏了程序的封装性!所以,全局变量是能少用尽量少用。
以下创造一个简单的GUI给大家说明一下,建一个GUI,包含两个按钮,一个坐标系,一个用来画y=sin(x),一个用来画y=cos(x);eg:在GUI的OpeningFcn函数中写:global x y1 y2x=0:.1:2*pi;y1=sin(x);y2=cos(x);在pushbutton1_Callback函数中写Global x y1Plot(x,y1)在pushbutton1_Callback函数中写Global x y2Plot(x,y2)全局变量是比较方便的,但全局变量会破坏封闭性,如果不是有大量数据要传递,建议不要使用。
二、运用gui本身的varain{}、varaout{}传递参数这种方式仅适用于gui间传递数据,且只适合与主子结构,及从主gui调用子gui,然后关掉子gui,而不适合递进结构,即一步一步实现的方式。
输入参数传递(主要在子gui中设置):比如子GUI的名称为subGUI, 设想的参数输入输出为:[out1, out2] = subGUI(in1, in2)在subGUI的m文件中(由GUIDE自动产生):1.第一行的形式为:function varargout = subGUI(varargin)该行不用做任何修改;varargin 和varargout 分别是一个可变长度的cell型数组。
输入参数in1和in2保存在varargin中,输出参数out1,out2包含在varargout中;2.在subGUI的OpeningFcn中,读入参数,并用guidata保存,即:handles.in1 = varargin{1};handles.in2 = varargin{2};guidata(hObject, handles);返回参数的设置:1. 在主GUI的OpeningFcn函数中加上[out1, out2] = subGUI(in1, in2),用于调用子gui,并在结尾加上uiwait(handles.figure1); figure1是subGUI的Tag,主要是等待调用子gui的过程,从而获得子gui的输出参数out1、out2;2. subGUI中控制程序结束(如"OK”和"Cancel"按钮)的callback末尾加上uiresume(handles.figure1),注意是主gui的窗口handles.figure1,不要将delete命令放在这些callback中;3. 在子GUI的OutputFcn中设置要传递出去的参数,如varargout{1} = handles.out1;varargout{2} = handles.out2;末尾添加 delete(handles.figure1); 结束程序。
在GUI的OpenFcn中,如果不加uiwait,程序会直接运行到下面,执行OutputFcn。
也就是说程序一运行,返回值就确定了,再在其它部分对handles.output作更改也没有效果了。
加上uiwait后,只有执行了uiresume后,才会继续执行到OutputFcn,在此之前用户有充分的时间设置返回值。
通过以上设置以后,就可以通过 [out1, out2] = subGUI(in1, in2) 的形式调用该子程序。
在一个GUI中调用另一个GUI时,主GUI不需要特别的设置,同调用普通的函数一样。
在打开子GUI界面的同时,主程序还可以响应其它的控件。
不需要担心子GUI的返回值被传错了地方。
三、userdata数据直接通过对象的userdata属性进行各个callback之间的数据存取操作,主要适用于gui内。
首先必须将数据存储到一个特定的对象中,假设对象的句柄值为ui_handle,需要存储的值为value,则输入以下程序即可:set('ui_handle','UserData',Value);此时,value数据就存在句柄值为ui_handle的对象内,在执行的过程中若要取回变量可以通过以下方式在任意callback中获取该数据值:value=get(''ui_handle,'UserData');虽然使用这种方法简单,但是每个对象仅能存取一个变量值,因此当同一对象存储两次变量时,先前的变量值就会被覆盖掉,因此都用UserData存储简单与单一的数据。
如下面有两个gui函数,myloadfn加载mydata.mat文件,该文件内存储XYData变量,其值为m*2的绘图矩阵,加载后将该变量值存储到当前的窗口的UserData属性中。
另一个myplotfcn函数则是用以获取该UserData属性中存取的绘图数据,然后绘图。
代码如下:function myloadfcnload mydata;set(gcbf,'UserData',XYdata)function myplotfcnXYdata=get(gcbf,'UserData');x=XYData(:,1);y=XYData(:,2);plot(x,y);userdata的缺点就是一个句柄只能放一个Userdata。
四、GUI数据(handles)结合handles和guidata函数,适用于gui内,如果你在pushbutton1中得到一个变量X,相传出去,那么在pushbutton1的callback中,在得到X后添加如下代码:handles.X=X;guidata(hObject,handles)(注意,一定是两行连写)在pushbutton2中要用到X是,在其callback先添加X=handles.X;即可得到X的值。
注:1.guidata(object_handle,data);如果object_handle不是figure型句柄,那么会将data保存在object_handle的父figure对象中。
这样不必担心在一个pushbutton的callback中存储的变量在其他对象中无法提取。
2. data = guidata(object_handle);获取当前object_handle的handles数据,最后一次guidata(object_handle,data)保存的数据。
一个简单的GUI给大家说明一下,建一个GUI,包含两个按钮,一个坐标系,一个用来画y=sin(x),一个用来画y=cos(x);eg:在GUI的OpeningFcn函数中写:x=0:.1:2*pi;y1=sin(x);y2=cos(x);handles.x=x;handles.y1=y1;handles.y2=y2;guidata(hObject, handles);%注意,在OpeningFcn函数中这句是本身存在的,若在其它函数中,务必加上这句在pushbutton1_Callback函数中写x=handles.x;y1=handles.y1;plot(x,y1)在pushbutton2_Callback函数中写x=handles.x;y2=handles.y2;plot(x,y2)五、Application数据应用setappdata\getappdata与rmappdata函数,适用于gui间和gui内。
使用上面三个函数最有弹性处理数据的传送问题,与UserData的方式相类似,但是克服UserData的缺点,使一个对象能存取多个变量值。
(1)getappdata函数value=getappdata(h,name)(2)setappdata函数setappdata(h,name,value)(3)rmappdata函数rmappdata(h,name)首先在matlab命令窗口输入magic(3)数据,因此当前的工作空间就存储了magic(3)这组数据了,然后建立一个按钮来获取并显示magic(3)数据。
A=magic(3);setappdata(gcf,'A',A);%saveuicontrol('String','显示矩阵A','callback','A=getappdata(gcf,''A'')');A =8 1 63 5 74 9 2当在主、子gui内调用时,可以如下设置fig1调用fig2时,使用fig2指令来打开fig2,在fig2的m文件中,在回调函数中用setappdata(fig1,'A',A);实现返回fig1,并将参数A传递给fig1然后在fig1的使用A的地方添加A=getappdata(fig1,‘A’)。
但这种方式的一个问题就是每调用一次,fig1的数据就得初始化一次,这是因为setappdata(fig1,'A',A)中出现了fig1,调用一次setappdata就得运行一次fig1的缘故,解决方案就是把setappdata(fig1,'A',A)改为setappdata(0,'A',A),这样把A读入matlab workspace,相当于一个全局变量了,但当然比直接用global定义全局变量好!同样的例子:eg:在GUI的OpeningFcn函数中写:x=0:.1:2*pi;y1=sin(x);y2=cos(x);setappdata(handles.figure1,'x',x) %在figure1下创建’x’,包含数据x,也可以放在其它句柄下,如setappdata(handles. pushbutton1,'x',x),不过一般放在figure1下,记起来方便……setappdata(handles.figure1,'y1',y1)setappdata(handles.figure1,'y2',y2)在pushbutton1_Callback函数中写x=getappdata(handles.figure1,'x');%提取,当然用get了……y1=getappdata(handles.figure1,'y1');plot(x,y1)在pushbutton1_Callback函数中写x=getappdata(handles.figure1,'x');y2=getappdata(handles.figure1,'y2');plot(x,y2)六、跨空间计算evalin和赋值assignin适用于gui间和gui内Assignin函数基本语法assignin(ws, 'var', val)其中'base' or 'caller',分别表示基本工作空间和调用函数(caller function)工作空间,Assinin函数将值val指定给工作空间ws中的变量var,若变量var不存在,则创建一个变量var。