GUI界面之间的参数传递方法
- 格式:doc
- 大小:29.50 KB
- 文档页数:2
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的主回调函数中,定义一个句柄结构体,用来存储各个控件的句柄和相关变量。
然后,将该句柄结构体传递给其他控件函数,在这些函数中通过句柄结构体来访问和修改所需的变量。
这种方法可以很好地解决不同控件之间的变量传递问题,并且方便扩展和维护。
专题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编程心得一、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中(没有输出参数时可以放在其他地方)。
跳转页面并传递参数的方式实现办法:1-既然是实现页面跳转,并把参数传递过去,就必须有俩个页面2-新建俩个页面Default1.aspxDefault2.aspx (系统默然可自己改)3-添加1个文本框,2个RadioButton ,1个TextBox 控件。
4-注意:1 设置RadioButton时,要主意必须将GroupName 设为sex或者任意单词字母,否则两个RadioButton,都可以选。
2. 注意repeatDirectic和repeatlayout俩个属性的用法(选择属性时有智能提示)。
5-代码:protected void Button1_Click1(object sender, EventArgs e) {string name = this.TextBox1.Text;解:获取本文框里输入的内容string sex = "先生";if (RadioButton2.Checked)解:判断,如果RadioButton2被选中执行{sex输出女士。
并且把name的值传sex = "女士";Name,sex值传给Sex,并且把Name和Sex的值传给Default2.aspx。
否则执行elseResponse.Redirect("~/Default2.aspx?Name=" + name + "&Sex=" + sex);}else{sex = "男士";Response.Redirect("~/Default2.aspx?Name=" + name + "&Sex=" + sex);}}2 Default2.aspx 的代码protected void Page_Load(object sender, EventArgs e){string name = Request.Params["Name"]; 解:当页面刚加载时将Default2.aspxstring sex = Request.Params["sex"];的参数接受,并显示出来。
描述传递参数到操作系统的三种通用方法传递参数到操作系统有三种通用的方法,分别是命令行参数、环境变量和配置文件。
下面将分别对这三种方法进行详细描述。
1.命令行参数:命令行参数是一种传递参数的常见方式,它允许在执行命令时将参数直接传递给操作系统或应用程序。
通常在命令的后面加上参数,用空格或其他特定分隔符进行分割。
命令行参数可以是必需的或可选的,根据应用程序的需求而定。
通过命令行参数,可以对程序的行为进行定制,例如指定输入文件、输出文件、执行特定的功能等。
常见的命令行参数传递方式如下:```shell```其中,`--param1`和`--param2`是命令的参数名,`value1`和`value2`是对应参数的值,`--flag`是一个开关参数,用于设置一些功能是否启用。
2.环境变量:环境变量是在操作系统中定义的全局变量,它们是操作系统在启动时就设置好的。
环境变量的值可以通过命令行参数来设置,也可以在操作系统的配置文件中进行预定义。
应用程序可以通过读取环境变量来获取一些配置信息,如数据库的连接参数、运行日志的输出路径等。
通过环境变量传递参数有以下几个步骤:-设置环境变量:- 在Windows上,可以使用`set`命令设置环境变量,如`setPARAM_NAME=value`。
- 在Linux上,可以使用`export`命令设置环境变量,如`export PARAM_NAME=value`。
-在应用程序中读取环境变量:- 在Windows上,可以使用`%PARAM_NAME%`的方式读取环境变量的值。
- 在Linux上,可以使用`$PARAM_NAME`的方式读取环境变量的值。
3.配置文件:配置文件是一种存储配置信息的文本文件,应用程序可以读取配置文件来获取参数。
配置文件可以是INI格式、XML格式、JSON格式等,具体格式取决于应用程序的需求。
通过配置文件传递参数的步骤如下:-创建配置文件,并定义需要的参数。
Matlab多窗口传值问题(GUI)1.直接传递当要在一个matlab中的.m文件打开一个新窗口时候,可以直接传递例如有两个窗口A.fig/A.m 和B.fig/B.m在A.m中B(var1) ; 即可传入参数那么在B中这样获取即可:if length(varargin)==1some_var= varargin{1};end2.通过output属传回在A.m中some_var=B(var1);也就是B还需要返回值。
那么在B中就需要设置handles的output值了function varargout = B_OutputFcn(hObject, eventdata, handles) varargout{1} = some_var_in_figure_B;3. 几个重要的函数1.getappdata(h,'Name'); 获取窗口句柄为h中的'Name'变量2.setappdata(h,'Name',value);设置窗口句柄为h中的'Name'变量为Value3.isappdata(h,'Name'); 判断h句柄下面有无‘Name’的变量4.rmappdata(h,'Name');删除h句柄下面‘Name’的变量5.guidata(h); 获取窗口句柄为h的handles结构6.guidata(h,handles); 设置窗口句柄为h的handles结构为handles7.guihandles(h) 生成handles结构说明:关于appdata的几个函数是最基本的,每个figure都可以有几个很多appdata,setappdata(0,'Name',value) 当设置句柄为0时,表示整个Matlab 共享的数据域,任何figure都可以访问。
这也可以成为数据传递的另一种方式。
GUI数据传递(需要一定matlab基础)主要分两类:GUI内部数据传递及GUI之间的传递,用appdata都可以实现,用法稍有不同。
内部:①在定义数据的Callback函数结尾,setappdata,句柄为figure的tag,句柄格式为handles.tag。
格式为:set(handles.tag,'Name',Value(或者就是变量名));②在使用数据的Callback函数开头,进行数据承接,getappdata,格式类似:格式为:Nargs = get(handles.tag,'Name’);外部:①在定义数据的figure函数的Openning函数体中,setappdata,句柄为‘0’,即屏幕的句柄格式为:set(0,'Name',Value(或者就是变量名));②在使用数据的figure函数的Callback函数开头,getappdata,句柄为‘0’。
格式为:Nargs = get(0,'Name’);之所以不在Openning函数中进行承接,是因为如果现在Openning中承接,Callback函数要用还得进行内部appdata传递,不能直接用。
直接在Callback承接能简便些,但是缺少条理性几个要点:①set(0,‘Name’,Value),其实质就是将变量存进屏幕的结构体中,级别高,因此效果相当于全局变量。
但是当从一个GUI中调用这些数据时,必须确保所用数据已经调进系统内存,也就是说,存在这样一种情况:当我们在系统重启后,马上开始运行一个GUI,这个GUI可能会出现数据不足的状况,就是因为其所调用的那些屏幕级的appdata没有被调进内存,它们在系统启动后还没被运行过。
怎么办呢?只能再增加几行程序特地把它们加进内存,在调用语句getappdata前,按如下语句将所需要的figure开启然后关闭:格式为:h=tag_of_figure;close(h);开启又关闭,看似没有用,但是经过一次启动,各个figure里面的setappdata 都能得到运行,把数据写到屏幕级内存中,作用非小。
GUI(图形用户界面)和CUI(命令行用户界面)是两种常见的用户与计算机程序交互的方式。
在软件开发过程中,GUI和CUI之间的交互迭代可以采取多种方式,具体取决于项目的需求和目标。
以下是一些常见的GUI到CUI交互迭代的方式:1.命令行参数:GUI程序可以通过命令行参数接收用户输入,并将这些参数传递给CUI程序进行处理。
CUI程序可以根据参数执行相应的操作,并将结果返回给GUI程序进行显示。
这种方式适用于简单的命令和参数传递。
2.进程间通信:GUI程序和CUI程序可以作为独立的进程运行,并通过进程间通信(IPC)机制进行交互。
IPC可以使用各种方法,如管道、消息队列、共享内存等。
GUI程序可以将用户输入和相关数据发送给CUI程序,CUI程序处理后再将结果发送回GUI程序进行显示。
这种方式可以实现更复杂的交互和数据共享。
3.脚本文件:GUI程序可以将用户输入和相关数据保存到脚本文件中,然后调用CUI程序来执行该脚本文件。
CUI程序读取脚本文件中的数据并执行相应的操作,然后将结果保存回脚本文件或输出到标准输出流中。
GUI程序可以读取脚本文件或捕获CUI程序的输出来获取结果并进行显示。
这种方式适用于需要保存和重用用户输入的情况。
4.网络通信:GUI程序和CUI程序可以通过网络通信进行交互。
GUI程序可以作为客户端,而CUI程序可以作为服务器。
GUI程序将用户输入和相关数据发送到服务器,服务器处理后再将结果发送回客户端进行显示。
这种方式可以实现远程交互和分布式系统的支持。
需要注意的是,选择适合的GUI到CUI交互迭代方式取决于项目的具体需求和约束条件,包括交互的复杂性、数据传输量、实时性要求、系统环境等。
在设计和实现过程中,还需要考虑用户体验、错误处理、安全性和性能等因素。
MATLABGUI数据传递总结在MATLAB GUI中,数据传递是指将数据从一个组件传递到另一个组件或从一个回调函数传递到另一个回调函数的过程。
数据传递在实际应用中非常常见,帮助实现用户界面与数据之间的交互和动态更新。
本文将总结MATLAB GUI中的数据传递方法,包括全局变量、handles结构体、UserData属性、公共数据区域、消息队列等技术。
1.全局变量:使用全局变量可以在GUI的所有回调函数中共享数据。
在GUI的函数中声明一个全局变量,并在回调函数中直接使用或修改这个全局变量。
在声明全局变量时需要加上“global”关键字,以告知Matlab该变量是全局变量。
优点:简单易用,无需额外的函数或配置。
缺点:可能造成命名冲突、数据不安全,不适合在多线程应用中使用。
2. handles结构体:在MATLAB GUI中,所有控件(如按钮,文本框)都有一个handles属性,该属性是一个结构体,包含了GUI中所有控件的句柄。
可以将数据存储在handles结构体的字段中,以实现数据的传递和共享。
在GUI的回调函数中,可以通过handles结构体的字段来读取和操作数据。
优点:方便灵活,可以在一个句柄结构中存储多个数据。
缺点:不适合存储大量的数据,可能导致处理的复杂性和性能问题。
3. UserData属性:每个MATLAB GUI对象都有一个UserData属性,可以用于存储自定义的数据。
可以将数据存储在UserData属性中,并在需要时通过get函数进行读取。
在回调函数中可以直接访问对象的UserData属性。
优点:简单易用,每个控件都有自己的UserData属性。
缺点:不适合存储大量的数据,可读性较差。
4.公共数据区域:使用MATLAB中一个.m文件作为公共数据区域,将数据保存在该文件中的全局变量中。
其他GUI回调函数可以通过该文件直接访问和修改全局变量。
优点:方便易用,数据共享简单。
缺点:容易造成命名冲突、数据不安全,不适合在多线程应用中使用。
GUI界面之间的参数传递方法(1-3)
今天,研究了一下不同GUI之间的参数传递方法,Matlab中GUI之间参数传递不如VC一样简单,易于理解,但是如果理解了,也是有章可循的,传说的具有六种方法,介绍其中的一种,如下所示:
**运用gui本身的varain{}、varaout{}传递参数。
上面介绍的方法只是适用于主从GUI之间传递参数,即从主GUI调用子GUI,然后关掉子GUI,子GUI的参数就传递到了主GUI,比如子GUI的名称为subGUI, 设想的参数输入输出为:[out1, out2] = subGUI(in1, in2)
在subGUI的m文件中(由GUIDE自动产生),varargin 和varargout 分别是一个可变长度的cell数组(MATLAB帮助文件中有说明)。
输入参数in1和in2保存在varargin中,输出参数out1,out2包含在varargout中;在subGUI的OpeningFcn中,读入参数,并用guidata 保存,即:handles.in1 = varargin{1};handles.in2 = varargin{2};
guidata(hObject, handles);
返回参数的设置:
1. 在GUI子程序的OpeningFcn函数的结尾加上uiwait(handles.figure1); figure1是subGUI 的Tag;
2. subGUI中控制程序结束(如"OK”和"Cancel"按钮)的callback末尾加上uiresume(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的返回值被传错了地方。
综上所述:一是,两点需要注意,uiwait和uiresume的使用位置和使用时机,二是,delete 句柄的位置……
通过以上设置以后,就可以通过[out1, out2] = subGUI(in1, in2) 的形式调用该子程序。
在一个GUI中调用另一个GUI时,主GUI不需要特别的设置,同调用普通的函数一样。
在打开子GUI界面的同时,主程序还可以响应其它的控件。
不需要担心子GUI的返回值被传错了地方。
success……哈哈……
方法二
延续以前的博文,今天介绍一下方法二,利用setappdata和getappdata函数进行不同GUI之
间的参数传递问题。
getappdata函数,V ALUE=getappdata(H,NAME);setappdata函数,setappdata(H,NAME,V ALUE)。
具体地应用如下所示:
当在主子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定义全局变量好!必须注意的是:在主程序和子程序中均要用0,否则不管用……此方法和第一种的不同即:第一种是启动主程序后,再启动子程序,进行设置参数,而这一种方法是先启动子程序,设置好参数后,启动主程序,这是参数已经传到主程序……
方法三
前面有了两种方法了,今天就研究一下第三种方法,这种方法在GUI内的数据传递也是比较常用的:全局变量。
这种方式恐怕是最简单的方式,是很省心!但是,简单的问题就在于有时你会很头疼!
因为在每一个要到该全局变量的地方,你都要添一句gloal x,还有就是如果你在一个地方修改了x的值,那么所有x的值就都变了!有的时候恐怕会出现紊乱。
另一个更重要的问题在于,套用C++的一句话,全局变量破坏了程序的封装性!所以,全局变量是能少用尽量少用。
不过因为简单,一般的小程序,还是会经常用到的……。