Matlab GUI界面编程小白学习笔记

本文详细记录了一位新手使用MATLAB设计GUI界面的过程,从了解基本控件到实现数据读取、变量交互、图形显示及保存。通过实例学习,逐步掌握了GUI界面的创建、美化和功能实现,包括数据的打开读取、编辑文本的初始化、清空及恢复默认值、静态文本的输出和清空、坐标轴的清空、数据的保存与导出,以及进度条的使用。整个过程充满挑战,但最终成功完成任务。
摘要由CSDN通过智能技术生成

某个天朗气清的下午,老师给我布置了一个Matlab GUI 界面设计的任务,然后欢天喜地回家结婚去了,留我在美好的假期里继续孤零零地在学校里耕耘。好的,在此先祝贺老师新婚快乐,百年好合。然后咱们开始从零开始,一边学,一边做。

作为一个GUI小白,当然不能盲目瞎胡来。我们首先要了解gui设计的一些基本的知识,比如如何添加控件、修改控件名称、如何定义变量、获取变量、怎么传递变量等等。这些在网络上都可以搜的到,在此不多赘述了。这边奉上几个小链接,都是很好的学习资料,大佬们总结的太好了。

1.matlab如何创建图形用户界面gui?
上面这个例子可以让我们学会一些基本的操作。如何设置静态文本、动态文本、坐标轴什么的。可以自己尝试做个简单的小程序玩一下。好的,我做了个1+1=2. 挺简单的是吧!(smile~)后来改了一次函数什么的,总之第一天花一点时间先熟悉一下界面。

2.MATLAB GUI界面编程——一些细节问题
第二个例子,这篇博文也写的很清楚。不过我要强推的是这篇文章最后推荐的另一篇文章。该网页内二楼提供了一个PDF文档,是一个很完整的界面编程实例。再次上链接,我是个稳妥的搬运工~一个实例搞定MATLAB界面编程.pdf

又花了一天时间,把这个实例好好学习了一下,在自己的Matlab 里运行成功了,我的Matlab版本是R2016b。运行成功以后,也重复看了好几遍这个程序,理解程序里对变量的定义和传递(这个蛮重要的)。关于这个实例的内容在此不提,跟着一步步做就可以了。

整个做完这一整个例子,我开始信心满满地(划掉——)投身老师给我的任务。主要分为以下几个步骤:
(1)规定自己的设计目标。比如导入数据、输入哪些参数、输出哪些参数、要显示什么图像、哪些数据要保存以及保存成什么类型的数据等等,这些都要提前想好并列出清单。
(2)界面设计排版。鉴于之前有不断被甲方爸爸要求做PPT、改PPT做了好长一段时间的辛酸经历,我觉得界面设计的美观程度还是蛮重要的。于是我参照了一些和我要做的任务类似的GUI界面,对我的GUI界面进行初步排版设计。
(3)编写程序。我给自己的程序分了几个阶段:第一步是数据的打开、关闭;第二步,主程序的编写;第三步,输出结果的保存、导出;第四步,处理一些细节问题和小错误。

emmm,整个过程大概花了整整三天的时间,一边报错,一边修改,可算是调试成功并完成了,真是万幸。下面记录一些自己在学习过程中遇到的问题和部分代码。

1、数据的打开,读取
(1)设计目标:点击“打开”按钮,选择txt文件,读取txt文件里的数据。

function m_file_open_Callback(hObject, eventdata, handles)
% hObject    handle to m_file_open (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% filepath = uigetdir('*.*','请选择文件夹');
[filename, pathname] = uigetfile( ...
    {'*.bmp;*.jpg;*.png;*.jpeg;*.txt', 'Image Files (*.bmp, *.jpg, *.png,*.jpeg,*.txt)'; ...
    '*.*', 'All Files (*.*)'}, ...
    '选择txt文件');
if isequal(filename,0) || isequal(pathname,0) % 处理取消打开文件的情况
    return;
end
filepath=pathname;%
handles.filepath=filepath;
fid=[pathname filename];%将文件名和目录名组合成一个完整的路径,获取txt文本
fid1=fopen(fid);

% 读入 txt 文本信息
data1=[];
s1=0;
while ~feof(fid1)%~feof表示若未读到文件末尾则继续循环
    s1=s1+1;
    tline1=fgetl(fid1);%fgetl 按行读取
    idx=strfind(tline1,',');%查找 , 字符串
    if ~isempty(idx) % ~isempty判断是否为空,是为0,否为1
        if strcmp(tline1(1),'"') %strcmp比较字符串,如果是和 " 一样的,返回1
            data1(s1,1)=str2num(tline1(2:idx(1)-1));
        else
            data1(s1,1)=str2num(tline1(1:idx(1)-1));
        end
       str1=tline1(idx(1)+1:idx(2)-1);%查找时间信息所在的位置
       data1(s1,2)=datenum(str1); % time
       for i=4:14
           data1(s1,i)=str2num(tline1(idx(i-1)+1:idx(i)-1));%依次存储第3,4,5...14个信息
       end
    end    
end
fclose(fid1);
handles.data1=data1;
guidata(hObject, handles);

2、设置变量中遇到的一些问题(主要是针对输入变量的)
设计目标:输入变量既有自己的默认值也可以手动编辑,在点击“恢复默认值”按钮时,可以恢复到默认值状态。另外设置“清空”按钮,点击“清空”按钮,可以对可编辑文本框进行清空,需要自己手动输入数值。
下面是我设置的几个按钮;
在这里插入图片描述

(1)可编辑文本变量的输入。
在主程序的“运行”按钮的callback回调函数下,在function m_file_run_Callback(hObject, eventdata, handles)下输入:

m_image_a=str2double(get(handles.m_image_a'String'));
m_image_b=str2double(get(handles.m_image_b,'String'));

这样就可以获得编辑框内的数字了。m_image_a是设置的对应编辑文本的Tag值。顺便提一下,回调函数的查看和设置都是可以自动定位的,只要我们在设计界面内的控件上 右键 > 查看回调,就可以选择我们需要的回调函数了。
在这里插入图片描述
(2)可编辑文本的初始化或设置默认值。
我想别人打开我的界面的时候,点击“恢复默认值”按钮,就可以让对应的可编辑文本框m_image_a里显示我想要的内容。那我们就需要在可编辑文本框m_image_a的CreateFcn回调函数下进行定义。在function m_image_a_CreateFcn(hObject, eventdata, handles) 的最后加上

set(hObject,'string','3');

这样我们就能够将Tag值为m_image_a的可编辑文本框的默认值设置好啦,我设置的是3。注意在一个界面里,每个控件都有自己唯一的Tag名称,那就是他们的大名,不能有重复的两个Tag值。还有设置某个控件的Tag值,名称中间不要加空格,否则是无效滴。
在这里插入图片描述
(3)可编辑文本的清空。
这个步骤分为两步,
第一步,在可编辑文本m_image_a的KeyPressFcn回调函数 function m_image_a_KeyPressFcn(hObject, eventdata, handles)后加上如下代码

set(hObject,'string','','Enable','on');
uicontrol(hObject);

第二步,在“清空”按钮的callback回调函数function m_image_clear_Callback(hObject, eventdata, handles)后加上如下代码

feval(@m_image_a_KeyPressFcn,handles.m_image_a,eventdata,handles);

feval函数可以用来调用其他函数的功能。

(4)静态文本变量的输出
这个静态文本的变量呢,我们是不能自己编辑的,那我们是通过其他变量计算得到的,然后显示在静态文本框内。那我们在“运行”按钮的callback回调函数下继续编辑

m_image_c=m_image_a+m_image_b; %m_image_a 和 m_image_b都是可编辑文本变量,m_image_c 是静态文本变量
set(handles.m_image_c,'String',num2str(m_image_c,'%.2f')); % 保留两位小数

m_image_a 和 m_image_b都是可编辑文本变量,m_image_c 是静态文本变量。
在这里插入图片描述

(5)静态文本变量的清空
和可编辑文本变量的清空类似,同样咱们分为两步。
第一步,在静态文本m_image_c的CreateFcn回调函数 function m_image_c_CreateFcn(hObject, eventdata, handles) 后面加上,

set(hObject,'string','');

第二步,在“清空”按钮的callback回调函数function m_image_clear_Callback(hObject, eventdata, handles)后加上如下代码

feval(@m_image_c_CreateFcn,handles.m_image_c,eventdata,handles);

那像这样咱们在点击“清空”按钮之后,就可以把可编辑文本和静态文本都清空空啦!
在这里插入图片描述
(6)坐标轴的清空
我的运行程序完成以后,是要显示图形的。运行程序以后,就会出图,那么如果我想清空数据,重新运行,那就要把界面上的数据和图都清除干净。清除图形我用的是下面这个方法,同样是在“清除”按钮的callback回调函数下进行编辑,加上

try
    delete(allchild(handles.axes_test));
end

axes_test是要清除图形对应的坐标轴Tag值。

(7)其他变量的定义,输出
如果在程序运行的过程中,我们需要定义其他的一些变量,后期需要导出这些变量的值的话,我们需要对其进行定义。在“运行”按钮的callback回调函数下,进行编辑,参考如下

d=8;
handles.d=d;
set(handles.m_image_d,'String',num2str(d,'%.2f'));
guidata(hObject, handles);

3、输出数据的保存、导出

【下次再写。。。。下班时间到了。。。】

【好了,又到上班时间了,咱们继续来介绍输出数据的保存和导出】

我们先在菜单编辑器里加一个“保存” 的菜单项,具体的设置操作请参考前文里提到的实例:一个实例搞定MATLAB界面编程.pdf 。当然,也可以自己设置一个“保存结果”的按钮,想怎么设置就看各位的心情了~
在这里插入图片描述
在这里插入图片描述
我们就按照第一个,在餐单编辑器里的“保存”菜单下,加一个“保存”的子菜单,Tag值设为m_file_save。

以保存变量result为例,变量result 是我们自己定义(或计算出来的)变量,在“运行”按钮的callback回调函数下,进行编辑,figure_m_image是整个设计界面的Tag值,在所有控件之外的地方右键,就可以更改它的Tag值。

result=8;
handles.result=result;
setappdata(handles.figure_m_image,'result',result); 
guidata(hObject, handles);

那么要想保存变量result,我们在刚刚设置的“保存”按钮的callback回调函数其后加上如下代码:

result=getappdata(handles.figure_m_image,'result'); 
[FileName,PathName]=uiputfile({'*.txt','Txt Files(*.txt)';'*.xls','Excel(*.xls)';'*.*','All Files(*.*)'},'选择保存的文件名');  %% pathname获取保存数据路径, filename获取保存数据名称
if ~FileName
    return;
else
    str= [PathName,FileName];
end
fid = fopen(str,'wt');
 fwrite(fid, '', 'integer*4');
 for n=1:11
 fprintf(fid,'%s\n',char(result{n}));    %   \t表示空格
 end
 fprintf(fid,'\r\n');   %换行
 fclose(fid);

这样就可以以txt,xls等格式保存并导出我们的数据了,其他的格式可以自己探索。

4、其他的一些小玩意
你的主程序如果也和我一样需要运行一段时间的话,我们可以给它加上进度条,这样别人在运行我们的程序的时候,可以比较直观的看到我们的程序在运行,不然点了运行按钮以后,没啥变化,然后过了一段时间,才跳出来我们的结果。

同样的,我们在“运行”按钮的callback回调函数下,进行编辑,在主程序的前面,加上如下代码:

steps=100;
hwait=waitbar(0,'请等待>>>>>>>>');
for k=1:steps
      if steps-k<=5
            waitbar(k/steps,hwait,'即将完成');
            pause(0.05);
      elseif 50<steps-k<5
            str=['请勿取消',num2str(k),'%'];
            waitbar(k/steps,hwait,str);
            pause(0.05);
      else
            str=['正在运行中',num2str(k),'%'];
            waitbar(k/steps,hwait,str);
            pause(0.05);
      end;
end;

然后在主程序的最后,加上

close(hwait); % 注意必须添加close函数,也就是说运行完成后让此进度条消失。

这样我们的程序开始运行以后,就会跳出进度条;等到运行完成以后,进度条就会消失;
在这里插入图片描述
在这里插入图片描述
ummmm,差不多就这么多了。其他的一些例如如何退出程序啊什么的,在之前反复提的那篇实例pdf文档里都有很详细的说明,在此处就不重复提了。上面那些代码不一定是最优的代码,后面会继续学习~
最后依旧致敬 LYC 同学~ 向他学习,day day up! over~
秋天到了,眠食诸希珍重~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值