用MATLAB GUI做一个简单的绩点计算界面

用MATLAB GUI做一个简单的绩点计算界面本文主要记录如何用MATLAB自带的GUI功能做一个绩点计算界面。并以此来简单介绍一下MATLABGUI的使用过程。完整代码见:https://github.com/ZhouJiaHuan/compute-GPA-master启动guide工具箱guide是MATLAB用来制作GUI界面的工具性,我们只要在MATLAB命令窗口中输入命令guide即可打开GUI制作界面,如下图:…

大家好,又见面了,我是你们的朋友全栈君。

本文主要记录如何用MATLAB自带的GUI功能做一个绩点计算界面。并以此来简单介绍一下MATLAB GUI的使用过程。完整代码见:https://github.com/ZhouJiaHuan/compute-GPA-master

启动guide工具箱

guide是MATLAB用来制作GUI界面的工具性,我们只要在MATLAB命令窗口中输入命令guide即可打开GUI制作界面,如下图:
这里写图片描述
在新建GUI这一栏中提供了几种常用的界面,这里我们直接选用BLANK空白界面即可。
这里写图片描述
这样就会生成一张初始的空白界面,我们可以直接点击工具栏中绿色的运行按钮看一下初始界面的效果。
这里写图片描述
文件名保存为test.fig,点击运行后,发现一共生成了两个文件,一个是界面文件test.fig,另一个是对应的test.m文件。test文件中保存的就是界面文件中的所有信息。一般我们制作GUI界面分成2个步骤:(1)设计GUI界面,即在界面上添加一些我们需要的控件等;(2)写回调函数,简单的说,每一个控件被添加到界面上肯定是有其特定的功能(显示信息、按钮操作等)。比如你想通过按一个按钮去执行特定的功能,这个时候你就把需要执行的代码写在按钮的回调函数里。

一个简单GUI示例

为了帮助理解这个过程,我们先来建立一个简单的GUI来介绍:要求在界面上放置1个按钮,和3个文本框,其中两个文本框用来输入两个数,当按下按钮的时候,计算两个数的和并显示在第三个文本框中。

我们现在刚刚的空白界面上添加几个控件(3个文本框和1个按钮),直接从左侧的控件中拖过来即可。如下图所示:
这里写图片描述
文本框中默认显示是内容是“可编辑文本”,我们可以通过双击控件来修改该控件的属性,这里我们先修改第一个文本框的属性:
这里写图片描述
上图中我分别修改了3个属性:将显示的字体设为20号、将默认显示的字符串设为“0”、
这里需要重点注意的是Tag属性,它每个控件的句柄名,可以理解为每一个控件的名字,在下面写回调函数的时候,都需要通过Tag属性的值来传递数据,因此,所有控件的Tag属性内容不能相同。

按照相同的方法我们依次修改剩下来的控件的属性,并添加一些静态文本增强可读性:
这里写图片描述

以上只是简单地把界面做好了,为了实现我们需要的功能,还需要写回调函数,我们再想一下我们需要实现的功能:按下求和按钮后,计算两个数的和,最后显示在文本框中。因此,我们只需要写求和按钮的回调函数,并读取两个文本框中的信息,然后把计算的结果传递到第三个文本框中。

这里需要介绍GUI中用于传递数据的函数:set()和get()。set()函数用于修改某个控件的属性值。比如我想把Tag名为“add1”的文本框的显示内容改成“1”,可以通过下面的代码实现:

set(handles.add1, "string", 1)

同样,我们如果想要获取一个Tag名为“add1”的文本框内容,可以通过get()实现:

num1 = str2num(get(handles.add1, "string"))

由于获取到数据的类型是string格式的,在计算的时候需要转换。因此用str2num()完成转换过程。

在了解了set()和get()的基本用法,下面我们就来看看求和按钮的回调函数怎么写。

右击求和按钮选择查看回调,继续选择Callback,会打开test.m文件,并自动创建回调函数,如下图:
这里写图片描述
这里写图片描述
回调函数的名字是根据控件的Tag属性创建的,由于我求和的Tag属性是“add”,因此对应的回调函数名字叫“add_Callback”
在函数体中添加如下代码:

num1 = str2num(get(handles.add1, 'string'));
num2 = str2num(get(handles.add2, 'string'));
result = num1 + num2;
set(handles.sum, 'string', result);

这里写图片描述
运行测试结果:
这里写图片描述

大功告成,还是很简单的吧,下面我们就步入正题,制作我们计算绩点的界面吧!

绩点计算工具

第一步当然还是设计界面,如下:
这里写图片描述
界面上的控件主要有两类,右侧是一组按钮,中间是需要显示是成绩单信息。我们期望的功能如下:

  • 点击导入成绩表,会打开文件浏览器,查找本地的成绩表并导入,同时在中间显示基本的信息;
  • 点击计算绩点,按照指定的绩点计算方法计算绩点,计算成功后弹出提示信息;
  • 点击导出结果,保存计算好的绩点并保存到本地的表格中;
  • 点击退出,退出程序

下面我们就依次编写4个按钮的回调函数:

导入成绩表:

% --- Executes on button press in Load_score.
function Load_score_Callback(hObject, eventdata, handles)
% hObject handle to Load_score (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global NUM TXT RAW
% 打开成绩表
[filename, pathname] = uigetfile({ 
   '*.xls'; '*.xlsx'});
full_name = strcat(pathname,filename);
% 导入成绩表信息
[NUM,TXT,RAW] = xlsread(full_name);
% 显示表格信息(路径、班级人数、课程数)
set(handles.Load_state,'string',full_name);
set(handles.Stu_num,'string',num2str(size(RAW,1)-1));
set(handles.Course_num,'string',num2str(size(RAW,2)-2));

这里需要注意的是,成绩表需要满足读取的格式,如下:
这里写图片描述

课程需要满足格式:课程名/类型/学分

计算绩点

% --- Executes on button press in Compute_GPA.
function Compute_GPA_Callback(hObject, eventdata, handles)
% hObject handle to Compute_GPA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global NUM RAW;
global GPA;
% 获取课程名和课程学分
[~, credit] = get_course_credit(RAW);
% 计算绩点
[GPA,~] = compute_GPA(NUM,credit);
msgbox('计算完成');

函数中调用了另外两个函数,分别定义如下:

function [course, credit] = get_course_credit(RAW)
% Function:
% 读取表格数据中学生信息(包括学号和姓名)
% Input
% RAW: 课程成绩表,第一行为表头,前两列分别为学号和姓名,成绩从第三列开始;
% 学号|姓名|课程1/必修课/学分1|课程2/必修课/学分2|
% ** | ** | ** | ** |
% ** | ** | ** | ** |
% ** | ** | ** | ** |
% Output
% course: (1,n),cell类型,存放所有的课程名(n门课程)
% credit: (1,n),double类型数组,存放所有课程对应的学分

num_course = size(RAW,2)-2; % 不包含前两列(学号、姓名)
course = null(num_course);
credit = null(num_course);
for i = 1:num_course
   course_name_credit = RAW{ 
   1,i+2}; %课程/必修课/学分
   course_credit = regexp(course_name_credit,'/','split'); %切分
   course{i} = course_credit{ 
   1}; % 课程名
   credit(i) = str2double(course_credit(end)); % 学分
end
function [GPA,GPA_per_course] = compute_GPA(NUM,credit)
% Function:
% 计算所有学生的平均绩点(加权平均)
% Input
% NUM: (m,n),double型,存放所有m个学生的所有n门课程成绩,每一行对应一个学生的成绩
% score_11 | score_12 | score13 | --- | score_1n |
% score_21 | score_22 | score23 | --- | score_2n |
% ******** | ******** | ******* | --- | ******** |
% score_m1 | score_m2 | scorem3 | --- | score_mn |
% credit: (1,n),double型,存放所有课程的学分
% Output
% GPA: (m,1),double类型,存放所有学生的平均绩点
% GPA_per_course: (m,n),double类型,存放所有学生所有课程的的绩点

scores = NUM;
GPA_per_course = (scores-50)/10;
GPA_per_course(GPA_per_course<0) = 0;
GPA = GPA_per_course*credit'/sum(credit);

导出结果

% --- Executes on button press in Write_to_xls.
function Write_to_xls_Callback(hObject, eventdata, handles)
% hObject handle to Write_to_xls (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global RAW;
global GPA;
sorted_result = Sort_result(RAW, GPA);
xlswrite('sorted_GPA_result.xls',sorted_result);
msgbox('已导出至当前路径:sorted_GPA_result.xls');

代码中调用了Sort_result()函数来对结果进行排序,具体的定义如下:

function sorted_result = Sort_result(RAW, GPA)
% Function:
% 对绩点按降序排序并保存
% Input
% RAW: 课程成绩表,第一行为表头,前两列分别为学号和姓名,成绩从第三列开始;
% 学号|姓名|课程1/必修课/学分|课程2/必修课/学分|
% ** | ** | ** | ** |
% ** | ** | ** | ** |
% ** | ** | ** | ** |
% GPA: (m,1),double类型,绩点
% write_to_xls:0或1,表示是否导出xls文件
% Output
% sorted_result: cell类型,排序结果,[排名,学号,姓名,绩点]

[id, name] = get_id_name(RAW);
num_stu = length(name);
rank = 1:num_stu; rank = rank';
name_sorted = null(num_stu,1);
id_sorted = null(num_stu,1);

[GPA_sorted,Index] = sort(GPA,'descend');
for i  = 1:num_stu
    id_sorted{i,1} = id{Index(i)};
    name_sorted{i,1} = name{Index(i)};
end
title = { 
   '排名', '学号','姓名', '绩点'};
sorted_result = [title; num2cell(rank),id_sorted,name_sorted,num2cell(GPA_sorted)];
[id, name] = get_id_name(RAW);
num_stu = length(name);
rank = 1:num_stu; rank = rank';
name_sorted = null(num_stu,1);
id_sorted = null(num_stu,1);

[GPA_sorted,Index] = sort(GPA,'descend');
for i  = 1:num_stu
    id_sorted{i,1} = id{Index(i)};
    name_sorted{i,1} = name{Index(i)};
end
title = { 
   '排名', '学号','姓名', '绩点'};
sorted_result = [title; num2cell(rank),id_sorted,name_sorted,num2cell(GPA_sorted)];

退出

% --- Executes on button press in Quit.
function Quit_Callback(hObject, eventdata, handles)
% hObject handle to Quit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close(gcf);

最后看一下最终的效果:
这里写图片描述


写在最后的话:
感谢你一直读到这里,希望本篇博客对你有点帮助。关于本篇博客中的任何问题欢迎指出,虚心接受各位大佬的教导!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134154.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SiamFC 学习(论文、总结与分析)

    SiamFC 学习(论文、总结与分析)文章目录前言一、SiamFC论文学习1.介绍2.深度相似学习在跟踪中的应用2.1全卷积孪生结构3.引入库二、使用步骤1.引入库2.读入数据总结前言之前看了关于siamFC的论文、博客和代码,已经跑通了代码,但是,只是大概初步学习,没有认真的研究细节。为了后面更好的学习Siam系列的算法还是要重新认真的学习SiamFC。先附上论文和代码。论文:Fully-ConvolutionalSiameseNetworksforObjectTracking代码:基于pytorch框架的htt

  • html a标签跳转_点击a标签不进行跳转

    html a标签跳转_点击a标签不进行跳转如果a标签的”href”属性为空的话,当点击修改链接时并不会跳到对应页面,而是只在本页面进行了刷新操作。1<ahref=”JavaScript:js_method();”</a>这种方法地址也不发生跳转,在传递this等参数的时候很容易出问题;而且javascript作为a的href属性的时候会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放。W3C标准不推荐在href里面执行javascript..

  • ArcEngine 中的-2147467259错误

    ArcEngine 中的-2147467259错误ArcEngine中因数据不合规导致的-2147467259错误

  • 引爆炸弹

    引爆炸弹在一个n×m的方格地图上,某些方格上放置着炸弹。手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去。输入格式第一行输两个整数n

  • notepad++正则表达式替换字符串

    notepad++正则表达式替换字符串则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它能很好提高工作效率。EditPlus的查找,替换,文件中查找支持以下的正则表达式:表达式说明/t制表符./n新行..匹配任意字符.|匹配表达式左边和右边的字符.例如,”ab|bc”匹配”ab”或者”bc”….

  • 新手该如何学python怎么学好python?

    新手该如何学python怎么学好python?新手该如何学python怎么学好python?作为新人,对于如何学好PYTHON也是一头雾雨,也很想能得到别人的帮助。今天看到这篇文章,感觉学习起来有了一个方向.现摘录如下,以便给自己的学习提供一个参

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号