当用matlab编写完程序后,该程序实现某一功能。若要给用户使用,则不可能直接给程序,这样极其不方便,故有必要对其进行封装(通过将程序隐藏在一个界面中,用户只需操作界面即可实现某种功能),封装后基于该程序需要打开matlab才可以运行,故尽管封装完毕,仍然需要用户打开matlab进行运行,则也仍然不方便,毕竟不是每一位用户都愿意安装及打开matlab。那能不能不需要打开软件or不需要安装matlab就可以运行呢?→完全可以,这就需要对封装后的程序进行打包成独立可执行的exe文件。
总结:
封装→既保护源码,又便于用户傻瓜式操作
打包→可实现脱离MATLAB软件来运行程序
所用功能:MATLAB自带的appdesigner
PS:appdesigner界面设计可以实现的功能有很多,本文不进行逐一的介绍,若想要系统性学习,推荐阅读该博主专栏
但本文会通过一个例子来说明如何解决以下五大问题,实用性强。
下面以一个例子来呈现如何解决以上问题。
例子:假设现在已经完成了一个程序(以车间生产排班的程序为例),要将此程序进行封装,即设计一个只需操作界面功能键不需接触程序即可实现相应功能的界面。
打开MATLAB-appdesigner功能:在命令行窗口输入appdesigner后回车即可打开;
Appdesigner简要介绍:打开后左边是组件库、中间是空白框(因例子已事先写好,故此时非空白)、右边是设计视图和代码视图,见下图。
组件库:组件库就是设计界面的各组件(也称控件),可以在设计视图下将控件拖至空白处并进行排版,每个组件有着不一样的功能,想要系统学习每个组件可以参考上面所给链接。推荐配合该视频(上述专栏的b站视频)的1-7节来服用本文效果更佳。
【MATLAB】appdesigner系列教程(中文)_第一讲_哔哩哔哩_bilibili
组件拖动至空白处后代码视图会有所变动,但这是系统自带的插入组件的代码,可暂不处理;
设计视图:设计界面的排版视图。
代码视图:对设计视图的每个组件赋予代码,即使每个组件实现某种功能或使相互之间具有交互作用。
2.1 如何设置按钮、事先编好的主程序放在哪里?
设置按钮:将做需要的控件拖动至页面自认为合适的位置后,右键赋予功能。
举个栗子:现想给确认按钮一些功能,则右键按钮
点转至回调(ButtonPushed2是按钮名称,每个按钮名称可更改)即转至代码视图,
灰色区域的代码是自带的程序,白色区域放主程序。
总结:
设置控件→需要什么控件,则只需在组件库拖动至设计视图即可;
给控件功能→若该控件是执行整个程序的开始按钮,则放主程序,否则放该控件特有的功能(例如下面会提到的浏览文件的按钮等)
2.2 怎样使得封装打包后还能保持源代码生成csv文件的功能?
只要源代码中有生成.csv文件的功能,则封装打包后也会直接生成,这个无须担心。
eg. 这是放在【确认】按钮的主程序,无须对csvwrite源代码进行任何操作,可直接exe所在的当前文件夹中生成相应.csv文件。
2.3 怎样使得封装打包后还能保持源代码读取外部csv文件的功能?
2.4 怎样使得读取外部csv文件是一次性无顺序地浏览多个文件,而不是逐一进行浏览?
这个问题不同于第二个,第二个问题只需生成整个程序运行后.csv文件,这样只要程序固定即可生成;而读取外部可更改的文件,具有可更新性,因此不能简单地把文件一起封装(这样会导致文件内部数据也已被封装,即更改无效),因此需要采用另一种办法。
eg. 先看读取文件的源代码vs封装代码
VS
可以看到,源代码只需读取当前文件夹中名为(chechuang0.csv)的文件即可。但封装要求的代码并非简单地读取当前文件夹中文件的名称,因为封装打包成功后exe并不会自动识别当前文件夹路径,因此我们需要借用uigetfile函数来读取文件所在路径和文件名称【这时就需要在界面设置[浏览]按钮去读取文件,该按钮的回调函数就要利用到uigetfile函数】,
那么uigetfile是个什么函数呢?我们可以在命令行窗口doc一下!
下面截取部分进行解读:
①若只需一次性浏览一个文件,则代码
[filename,pathname] = uigetfile(‘*.csv’); %读取什么类型的文件则相应修改.csv。filename,pathname变量名可更改,但含义前者是将读取到的文件名赋给变量filename;后者是将读取到的文件所在路径赋给pathname;
故uigetfile函数可以记录用户读取的文件的路径和文件名(分别记录在path和file中);
If语句的含义是如果用户未读取任何文件,则输出User selected Cancel;否则输出User selected+[路径].(if语句非必须,看个人需要);
fullfile(pathname,filename)是将pathname与filename拼接成完整路径并显示出来。
②若需一次性浏览多个文件,则代码
[filename,pathname] = uigetfile(‘*.csv’,’MultiSelect’,’on’); %解释同上
因此通过uigetfile函数我们可知,我们可以把该函数设置在[浏览]按钮的回调函数中,并可设置路径框,当用户点击浏览的时候,就可以随意地浏览电脑上任意路径的文件并可显示其具体路径(路径的显示非必要,若不需显示路径,则可不采用fullfile即可)
下面仍然采用同一例子说明:
当用户点击浏览按钮,则会自动打开浏览界面,此时用户可随意选取文件,因本例子中已规定必须浏览九个文件名为a中元细胞的文件,否则会进行错误提醒,大家使用时可根据实际情况进行修改。现主要看浏览后的文件怎么样被主程序所使用呢?→需要将文件与主程序建立联系,那么如何建立联系?→通过文件路径的传递,因此此时要用到fullfile函数。举个栗子:现在想要将time10.csv文件被主程序利用,用uigetfile读取其路径储存到pathname后,采用fullfile(pathname,”time10.csv”)将time10.csv的路径拼接起来,这样就提取了该文件的完整路径。(其实到这里我们可以思考,为什么需要这样呢,这就是因为不封装打包时csvread读取的是当前路径的文件名为time10.csv的文件,根本不需要管它在哪里,只承认当前路径;但若要封装打包了,就需要提取该文件的路径。因此用到了uigetfile(提取)再用fullfile(进行拼接)。)再将完整路径赋值给一个变量(appdesigner跟matlab编程一样,需提前定义变量,其定义变量需要在特定框定义,如下图;定义完变量后使用该变量必须在前面加app.,如上图app.filename1)
(未添加变量时,定义变量框一般在代码视图的前面)
(把需要的变量添加在properties处)
这样就成功地将所需要的文件路径赋值给了相应变量,这些相应变量即可替换掉源程序中的文件名,再回去看对比图,就会清晰很多。
总结:
定义变量→用来储存用户选取的路径
提取路径→通过在[浏览]按钮回调函数中利用uigetfile来提取用户浏览文件的路径
拼接路径→利用fullfile将所提取的路径与文件名拼接,得到文件最终完整路径,并将其赋值在变量中
因此最后可以直接利用变量来代替源程序中的文件名。
2.5 如何设计界面的重要提醒功能?
①用户未按要求操作的重要提醒功能
先看例子代码(左)和效果(右)
注意uialert函数各个参数与效果的对应关系。
主体代码:
f = app.UIFigure; %建立图窗
message = sprintf(‘[ ]’); %[ ]是需要提醒的任意话语,或直接在uialert函数第二个参数用引号填内容’ ‘
uialert(f,message,‘ ‘,’Icon ‘,’ ‘); %关键语句
我们来doc一下看uialert函数具体用法:
第一个参数f [作用:建立图窗]:f = app.uifigure; %因为要在appdesigner中建立,故需加app.
第二个参数message[作用:主体信息]:%message在此只是起了中间变量的作用,实则该参数是提示内容’ ‘,可见上图效果图,其位置在中间部分
第三个参数title[作用:图窗左上角标题,是温馨提示or错误提示,可自拟]:’温馨提示’,位置在左上角
第四个参数:图标参数,需要组合使用。例如’Icon’,’success’表示对勾图标,也可以有’Icon’,’error’、’Icon’,’warning’等组合来改变图标,以此类推。
这样就可以建立提醒功能啦!
总结:
关键函数→uialert函数,因有多个参数,故前期需f和message的准备。
②用户点击关闭按钮的提醒功能
先看例子代码(左)和效果(右)
找到UIFigureCloseRequest函数窗口(每个代码视图都有,是自带的函数窗口)
主体代码:
selection = questdlg('确定要关闭窗口吗?',...
'是否关闭?',...
'是','否','是'); %quesetdlg函数的用法,并赋值给selection
switch selection %若selection为是,则关闭,否则返回
case '是'
delete(app)
case '否'
return
end
我们来doc一下看questdlg函数具体用法:
体会每个参数的对应关系,就可以运用这个函数啦。将用户操作的结果赋值给answer,switch语句是将answer值与相应功能做匹配。
总结:
关键函数→questdlg函数及switch语句。
声明:本人是根据①b站视频:【MATLAB】appdesigner系列教程(中文)_第七讲_如何进行app打包_哔哩哔哩_bilibili(前面的第7节视频);②知乎帖:MATLAB上APP Designer如何导出exe - 知乎进行学习,思考而得,并非完全自创。
学习方法:可根据下文逻辑提示进行学习。
Appdesigner主要有两种常用的打包方式:(在appdesigner共享下拉框)
①打包为APP封装文件→直接见上b站视频链接,很详细。缺点:仍需要打开matlab才能使用。
②打包为独立可执行的exe(又分为需要电脑有相应matlab版本的runtime的exe和不需电脑有相应matlab版本的runtime的exe) 后者不需要是因为在打包时将runtime也一并打包过去,因此所占内存会大很多,可能接近一个G;而前者只需几MB即可,但前者需要在用户电脑上安装rountime,总和也可能接近一个G。(下面说②)
这两种都不需要在matlab打开,即不需要用户电脑有matlab。
第一种优点:内存小、若电脑已下载有对应版本的runtime,则十分方便;
第二种优点:不需要电脑上有runtime、可以放在任意电脑上;缺点是所占内存较大(近1G)。
对于②而言,无论是哪一种方式打包,用作打包的matlab软件必须先配置编译环境和安装对应版本的runtime才可以进行②的任一种打包!!!个人觉得这个知乎帖写的很好!知乎帖MATLAB上APP Designer如何导出exe - 知乎
完成此思维导图1.2.,则matlab已具备方式②打包的条件啦!
PS:若电脑下载过Visual Studio则不必配置编译环境了,即不需进行第1.步!省事~
完成配置编译环境和安装runtime后。
首先第一种:若打包成Runtime downloaded from Web,则需下载相应版本的runtime,下载方式→打包后的文件会有每一步提示。
现展示流程如下:
添加完相应.m文件,在设置中修改打包后存放的文件路径后点击Package打包,打包ing:
稍等片刻(电脑配置越高则会越快些,配置低可能很慢),打包完成:
打包成功的文件:
双击MyAppInstaller_web根据提示进行安装(若电脑中无runtime,则会有两次提示,一次提示安装app,一次提示安装runtime,并可更改安装路径,最好放至同一路径中):
点击安装,等待完成即可。
安装后:
然后第二种:若打包成Runtime included in package,即把matlab的runtime也打包进去。这时,若以完成了思维导图的1.2.,即构造完打包所需要的条件后,参考知乎文MATLAB上APP Designer如何导出exe - 知乎完成3.即可。
总结:
一般发给用户可直接给②中方式一的打包成果,此种方法可在用户电脑上自动下载runtime且内存较小,或用户本身有runtime则更为方便;若用户想要直接一键安装,则可用②中方式二的打包成果,但内存较大。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删