文章目录
- 1. 初识GUIDE工具
- 1.1 .m 和 .fig的区别和联系
- 1.2 GUIDE工具的详细介绍
- 1.3 GUI控件的属性
- 1.4 自动生成的 .m 文件
- 1.5 回调函数
- 2. GUI中常见的函数
- 2.1 get 和 set 函数
- 2.2 handles.Tag
- 2.3 OpeningFcn 和 OutputFcn
- 2.4 Callback
- 2.5 CreateFcn 和 DeleteFcn
- 2.6 ButtonDownFcn 和 KeyPressFcn
- 3. GUI 示例
1. 初识GUIDE工具
1.1 .m 和 .fig的区别和联系
在MATLAB中,.m 文件和 .fig 文件是用于创建图形用户界面(GUI)的两个核心文件。
-
.fig 文件
(1) .fig 文件是一个二进制文件,存储了GUI的布局信息,包括所有UI组件(如按钮、文本框、滑块等)的位置、大小、颜色、标签等属性。 .fig 文件不能单独运行,需要与 .m 文件配合才能使GUI具有功能。
(2).fig 文件的作用:定义了GUI的外观和结构;.fig 可以通过MATLAB的GUIDE或 App Designer工具创建。
(3).fig 文件的生成方式:使用 GUIDE 或 App Designe 创建 .fig 文件。GUIDE 是 MATLAB 提供的一个图形化工具,用于快速设计和创建 GUI。首先在 MATLAB 命令行窗口中输入guide
并按回车键,这将打开 GUIDE 的启动界面;然后选择模板或空白项目,进而设计GUI 布局;最后保存文件,默认情况下,GUIDE 会生成两个文件:【1】.fig:存储 GUI 的布局信息。【2】.m:包含 GUI 的初始化代码和回调函数。.fig和.m的文件名必须严格一致,否则无法正确加载。还可以在MATLAB 命令行窗口输入appdesigner
,并按下回车键,会打开GUI启动界面。 -
.m文件
(1).m 文件是一个脚本文件(MATLAB代码文件),包含GUI的功能逻辑代码,定义了每个UI组件的行为和响应事件的回调函数(callback)。可以直接运行 .m 文件来启动GUI。
(2).m 文件的作用:实现GUI的功能,例如按钮点击后执行的操作、数据处理逻辑等。包含初始化代码,负责加载 .fig 文件并设置默认参数。用户可以在这里编写自定义代码来扩展GUI的功能。 -
二者联系
(1).m 文件依赖于 .fig 文件来定义GUI的布局和外观。.fig 文件本身没有功能,必须通过 .m 文件中的代码来实现交互。
(2)当运行 .m 文件时,MATLAB会自动加载对应的 .fig 文件,并根据其中的布局信息生成GUI窗口。然后,.m 文件中的回调函数会被绑定到各个UI组件上,使得GUI具备功能性。
(3)通常 .fig 文件和 .m 文件的名称相同(例如 myGUI.fig 和 myGUI.m),以便MATLAB能够正确关联两者。 -
总结
(1).fig 定义GUI 的外观和布局。.m 定义GUI的功能和逻辑。
(2)如果你使用的是较新的MATLAB版本(R2016a及以上),推荐使用App Designer(即在MATLAB 命令行窗口输入命令appdesigner
),它将 .fig 和 .m 的功能整合到了一个更现代化的开发环境中,简化了GUI开发流程。
1.2 GUIDE工具的详细介绍
MATLAB 的 GUIDE(Graphical User Interface Development Environment,图形用户界面开发环境)是 MATLAB 提供的一种用于开发图形用户界面(GUI)的可视化工具。GUIDE 提供了一个拖放式的设计环境,允许用户通过直观的方式创建和布局 GUI 组件,并为这些组件编写回调函数以实现交互功能。
-
GUIDE 的工作流程
(1)启动 GUIDE:在 MATLAB 命令行窗口中输入命令guide
;
(2)创建或打开 GUI:可以选择创建一个新的 GUI 或打开已有的 .fig 文件;
(3)设计 GUI 布局:使用 GUIDE 提供的工具箱,将按钮、文本框、滑块等控件(组件)拖放到 GUI 窗口(空白界面)上,然后可以调整控件的大小、位置和属性(如标签、字体、颜色等)。
(4)生成代码:当完成布局后,GUIDE 会自动生成 .m 和 .fig 两个文件。其中,.m 文件包含 GUI 的初始化代码和回调函数模板;.fig 文件保存 GUI 的外观和布局。
(5)编写回调函数:回调函数是当用户与控件(组件)交互时触发的代码块。用户需要根据需求在回调函数中编写具体的逻辑代码。
(6)运行和测试 GUI:运行 .m 文件以启动 GUI,并测试其功能是否符合预期。 -
GUIDE 的主要组件(控件)
GUIDE 提供了多种控件,用于构建 GUI 的不同功能模块。以下是一些常用的控件及其用途:
(1)Push Button (按钮、按键):按钮,点击时触发回调函数;
(2)Toggle Button (切换按钮):开关按钮,状态可以在按下和弹起之间切换;
(3)Slider (滑动条、滚动条):滑块,用于选择数值范围;
(4)Edit Text(文本编辑框):文本框,允许用户输入文本或数字;
(5)Static Text:静态文本,用于显示信息;
(6)Popup Menu (弹出式菜单):下拉菜单,提供选项列表;
(7)Axes (坐标轴):图形区域,用于绘制图像或图表;
(8)Listbox (列表选择框):列表框,允许用户选择多个选项;
(9)Checkbox (检查框):复选框,用于选择布尔值选项;
(10)Radio Button (单选框):单选按钮,用于选择一组选项中的一个。
(11)还有其它的控件…
1.3 GUI控件的属性
我们 “双击控件” 或者 “右键单击控件” ——>选择 “属性检查器”,可以打开检查器对话框,控件的属性如下图所示。
下面对常见的控件属性进行介绍:
- 控件的通用属性(适用于所有控件)
(1)Tag:控件的唯一标识符,用于在代码中引用该控件(必须唯一)。示例:设置按钮的 Tag 为 btnPlot,代码中通过handles.btnPlot
来访问该控件。
(2)String:控件上显示的文本内容(如按钮标签、文本框内容)。示例:按钮的 String 设为 “Plot Data”,显示为“Plot Data”。
(3)Position:控件的位置和大小,格式为[x, y, width, height]([左, 下, 宽, 高])。示例:[100, 50, 80, 30]表示控件左上角位于(100,50),宽80像素,高30像素。
(4)Callback:用户与控件交互时(如点击按钮)触发的函数。示例:按钮的Callback设为@pushbutton1_Callback,点击控件时执行该函数。
(5)Enable:控件是否可交互 或者说 控件是否可用(‘on’或’off’)。示例:禁用按钮——set(handles.btnSubmit, ‘Enable’, ‘off’)。
(6)Visible:控件是否可见(‘on’或’off’)。示例:隐藏错误提示文本——set(handles.textError, ‘Visible’, ‘off’)。
(7)BackgroundColor:控件的背景颜色,格式为 RGB 三元组或颜色名称。示例:BackgroundColor = [1, 0, 0](红色)或 ‘red’。
(8)FontName:字体名称(如 ‘Arial’)。示例:FontName = ‘Times New Roman’。
(9)FontSize:字体大小(单位:磅)。示例:FontSize = 12。
-
控件的特有属性
有关控件的特有属性就不做过多介绍了,等啥时候用到了再查。 -
控件的 Value和String 属性
(1)Value 属性:表示控件的数值状态或选中项的索引。其适用的控件有:滑动条(slider)、单选按钮(radiobutton)、复选框(checkbox)、弹出菜单(popupmenu)、列表框(listbox)、切换按钮(togglebutton)等。Value 属性的特点包括:通常是数值(如滑块的当前位置、选项的索引);对于单选按钮/复选框:Value = 1 表示选中,Value = 0 表示未选中;对于弹出菜单/列表框:Value 是选中项的索引(从1开始)。
(2)String 属性:表示控件显示的文本内容或选项列表。其适用的控件有:按钮(pushbutton)、文本框(edit)、静态文本(statictext)、弹出菜单(popupmenu)、列表框(listbox)等。String 属性的特点包括:存储文本字符串或字符串数组(如多行文本或选项列表);对于弹出菜单/列表框:String 是显示的所有选项(如 {‘Option1’, ‘Option2’})。
(3)属性 Value 和 String 的联系:某些控件需要同时设置 String 和 Value 以实现功能。例如:在弹出菜单 (popupmenu)中,String 定义选项列表(如 {‘A’, ‘B’, ‘C’});Value 表示当前选中的索引(如 Value = 2 表示选中“B”)。在列表框 (listbox)中,String 定义所有选项;Value 可以是单个索引或多个索引(多选模式下)。用户通过 String 看到的文本选项,需要通过 Value 转换为程序可处理的数值索引或状态。
1.4 自动生成的 .m 文件
我们使用工具 GUIDE 生成空的 main.fig (空的图形用户界面(GUI))对应的 main.m 文件模板如下所示。
matlab">function varargout = main(varargin)
% MAIN MATLAB code for main.fig
% MAIN, by itself, creates a new MAIN or raises the existing
% singleton*.
%
% H = MAIN returns the handle to a new MAIN or the handle to
% the existing singleton*.
%
% MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MAIN.M with the given input arguments.
%
% MAIN('Property','Value',...) creates a new MAIN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before main_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to main_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help main% Last Modified by GUIDE v2.5 27-Feb-2025 20:08:57% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @main_OpeningFcn, ...'gui_OutputFcn', @main_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before main is made visible.
function main_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to main (see VARARGIN)% Choose default command line output for main
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes main wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = main_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;
- 剖析参数:varargin、varargout、nargin 和 varargin
(1)nargin 和 nargout都是内置变量。其中,nargin 表示调用当前函数时实际传入的输入参数数量;nargout 表示调用当前函数时实际返回的输出参数数量。
(2)varargin 和 varargout都是特殊的 cell 数组(元胞数组)。其中,varargin 用于接收任意数量的输入参数;varargout 用于返回任意数量的输出参数,即 varargout 动态返回不同数量的输出结果。varargin使用场景:当你不知道调用者会传递多少额外参数,或者希望函数支持可选参数时,可以使用 varargin。varargout使用场景:当函数可能根据调用者需求返回不同数量的输出值时,使用 varargout 可以灵活处理。
(3)代码示例1:使用 varargin 和 nargin
matlab">result = test(2,3,5,6,7,8);
fprintf('result = %d\n', result);function result = test(a, b, varargin)% 显示输入参数的总数fprintf('总输入参数个数(nargin):%d\n', nargin);% 参数 vararginfprintf(class(varargin));fprintf('\n');% 返回 a 和 b 的和result = a + b;
end输出结果:
总输入参数个数(nargin):6
cell
result = 5
(4)代码示例2:使用 varargout 和 nargout
matlab">% 调用test(2,3)只有一个输出值result,因此MATLAB会自动将 varargout{1} 的内容提取出来并赋值给 result
result = test(2,3);
% 调用test(2,3)有两个输出值result1和result2,因此MATLAB会自动将varargout{1}的内容提取出来
% 赋值给result1, 将varargout{2}的内容提取出来赋值给result2。
[result1,result2] = test(2,3);
fprintf('result = %d\n', result);
fprintf('result1 = %d\n', result1);
fprintf('result2 = %d\n', result2);function varargout = test(a, b)% 使用 nargout 判断调用者请求了多少个输出if nargout == 1% 只请求一个输出,则返回 a 和 b 的和varargout{1} = a + b;elseif nargout == 2% 请求两个输出,则分别返回和与乘积varargout{1} = a + b;varargout{2} = a * b;elseerror('最多只支持两个输出参数!');end
end输出结果:
result = 5
result1 = 5
result2 = 6
- 函数句柄
句柄(Handle) 是一种特殊的对象类型,它允许你通过“引用”操作对象,而不是通过“值”。句柄类的核心特点是:多个变量可以指向同一个对象实例。修改其中一个变量的属性时,所有指向该对象的变量都会同步变化。这与传统的“值类”(默认行为)形成鲜明对比,你可以将句柄理解为对象的引用。函数句柄是通过符号 @ 创建,创建语法格式: Function_Handle = @Function_Filename
。代码示例如下:
matlab">% 我们将函数句柄放到结构体中
str = struct('Name','test', ...'f_sin', @sin, ...'f_add', @add);result1 = str.f_sin(pi/2); % 输出1
result2 = str.f_add(2,4); % 输出6
disp(result1);
disp(result2);function sum = add(x, y)sum = x+y;end
- 剖析参数 mfilename
在 MATLAB 中,mfilename 是一个内置函数,用于返回当前正在执行的 M 文件的文件名(不包含路径和扩展名)。它可以帮助你在代码中动态获取当前脚本或函数的文件名,这在调试、日志记录或动态生成文件名时非常有用。下面介绍 mfilename 的用法:
(1)默认用法(不带参数):直接调用 mfilename
会返回当前 M 文件的基本名称(不带路径和 .m 扩展名)。
(2)带参数用法:带参数 ‘fullpath’ ——mfilename('fullpath')
返回当前执行的脚本或函数的完整路径(不带 .m 扩展名)。
(3)代码示例,假设你正在编辑一个名为 example_function.m 的文件,运行以下代码:
matlab">disp(mfilename);
disp(mfilename("fullpath"));输出结果:
example_function
D:\MatlabProject\SIsoftware\Code\example_function
- ischar() 函数
在 MATLAB 中,ischar 是一个用于判断输入是否为字符数组的函数。如果输入是一个字符数组,则返回逻辑值 true(1),否则返回 false(0)。需要注意的是,ischar 仅适用于传统的字符数组(由单引号定义的字符串),而不适用于 MATLAB 的字符串类型(string 类型,由双引号 “” 定义)。代码示例如下:
matlab">% 检查字符数组
A = 'Hello, World!'; % 字符数组
result = ischar(A);
disp(result); % 输出:1 (true)% 检查字符串类型(string)
A = "Hello, World!"; % string 类型
result = ischar(A);
disp(result); % 输出:0 (false)% 检查其他数据类型
A = 123; % 数值
result = ischar(A);
disp(result); % 输出:0 (false)A = {'Hello', 'World'}; % 单元数组
result = ischar(A);
disp(result); % 输出:0 (false)
注意事项:(1)字符数组是由单引号 ' '
定义的,例如 'Hello'
;(2)字符串类型是由双引号 " "
定义的,例如 "Hello"
。(3)ischar 只能识别字符数组,不能识别字符串类型。(4)推荐使用 isstring
检查字符串类型:result = isstring("hello"); disp(result); % 输出:1 (true)
。
- str2func() 函数
在 MATLAB 中,str2func 函数用于将字符串形式的函数转换为函数句柄(function handle)。它允许你通过字符串动态地引用函数,这对于编写灵活的代码非常有用,尤其是在需要根据用户输入或配置文件调用不同函数的情况下。语法定义为:fh = str2func(funcName)
,其中 funcName表示一个包含函数名称的字符串(字符数组或字符串类型);fh 表示与指定函数名称相对应的函数句柄。代码示例如下:
matlab">% 将字符串 'sin' (或 "sin") 转换为函数句柄,
f_sin = str2func("sin");% 使用函数句柄计算 sin(0)
result = f_sin(0);
disp(result); % 输出:0% 自定义函数 myFunction, 将字符串 'myFunction' 转换为函数句柄
f_func = str2func('myFunction');
result = f_func(4);
disp(result); % 输出:6function output = myFunction(x)output = x + 2;
end
1.5 回调函数
每个控件都可以关联一个回调函数(Callback Function),当用户与控件交互时(如点击按钮或更改滑块值),相应的回调函数会被执行。GUIDE 中常用的 GUI 控件(组件)及其回调函数如下表所示。
UI 组件 | 主要属性 | 主要回调函数 |
---|---|---|
按钮(Push Button) | String(按钮文本) | pushbutton_Callback |
复选框(Checkbox) | Value(0 或 1) | checkbox_Callback |
单选按钮(Radio Button) | Value(0 或 1) | radiobutton_Callback |
列表框(Listbox) | String(列表项) | listbox_Callback |
下拉菜单(Popup Menu) | String(选项列表) | popupmenu_Callback |
编辑框(Edit Text) | String(输入文本) | edit_Callback |
轴(Axes) | XData, YData(图形数据) | axes_Callback |
- 关联事件
步骤:右键组件 → 查看回调(View Callbacks) → 选择事件(如 Callback 对应按钮点击)。通过该步骤,GUIDE会自动生成(或定位)回调函数框架。
2. 剖析参数:hObject, eventdata, handles
在通过 GUIDE 生成的 GUI 应用程序中,回调函数 pushbutton1_Callback(hObject, eventdata, handles)
是按钮控件的默认回调函数模板。这三个参数分别用于传递 GUI 控件的句柄、事件数据和全局句柄结构体。以下是它们的详细说明及示例。
(1)参数 hObject 是触发当前回调函数的控件(或对象)句柄(Handle)。通过 hObject 可以直接操作触发事件的控件属性(例如修改按钮文字、颜色等)。你可以将句柄理解为对象的引用。代码示例如下
matlab">function pushbutton1_Callback(hObject, eventdata, handles)% 修改按钮的文字为 "Clicked!"set(hObject, 'String', 'Clicked!');% 修改按钮背景颜色为红色set(hObject, 'BackgroundColor', [1 0 0]);
end当用户点击按钮时,按钮的显示文字会变为 "Clicked!",背景颜色变为红色。
(2)参数 eventdata 是 MATLAB 保留的参数,用于传递事件相关的附加数据。在传统 GUIDE GUI 中,此参数通常为空(这个参数 eventdata 通常是未使用的)。在更高级的控件(如 uitable 表格或图像点击事件)中,eventdata 可能包含事件信息(例如鼠标点击的坐标)。对于参数 eventdata不做过多介绍。
(3)参数 handles 是一个结构体(struct),包含 GUI 中所有控件和自定义数据的句柄。通过 handles 可以在不同回调函数之间共享数据或操作其他控件。注意事项:如果在回调函数中修改了 handles(例如添加了自定义字段:handles.custom_data = output_str
),必须调用 guidata(hObject, handles)
保存修改(将修改后的 handles 更新到全局),否则更改会丢失。
(4)参数 hObject 和 handles 的区别和联系
- hObject:操作当前控件的“快捷方式”,适合修改自身属性。例如,按钮 pushbutton1 被点击时,hObject 就是 pushbutton1 的句柄(引用)。
- handles:GUI 的全局控制中心,包含所有 GUI 组件的句柄,用于操作其他控件和共享数据。例如,按钮 pushbutton1 被点击后,可能需要修改 edit1 的文本,这时就需要 handles.edit1。
- handles 结构体中包含 hObject。例如,
handles.pushbutton1
等价于回调函数中的 hObject。 - 通过 handles 可以在不同回调函数之间共享数据,而 hObject 用于直接操作当前控件。
- 修改 handles 后需调用
guidata(hObject, handles)
,此时 hObject 作为参数确保数据更新到全局。
2. GUI中常见的函数
2.1 get 和 set 函数
-
get 函数用来获取图形对象(如按钮、文本框、坐标轴)的当前属性值。语法:
value = get(对象句柄, '属性名');
(1)示例1。获取编辑框中的文本:user_input = get(handles.edit1, 'String');
(2)示例2。获取滑动条的当前值:slider_value = get(handles.slider1, 'Value');
(3)示例3。获取坐标轴的横轴范围:x_limits = get(handles.axes1, 'XLim');
(4)注意事项。返回值的类型取决于属性(如字符串、数值、数组等)。可能需要类型转换(例如将字符串转换为数值):num = str2double(get(handles.edit1, 'String'));
。 -
set 函数用来设置图形对象(如按钮、文本框、坐标轴等)的属性值。语法:
set(对象句柄, '属性名', 值);
(1)示例1。修改按钮的显示文本:set(handles.pushbutton1, 'String', 'Click Me');
。
(2)示例2。设置背景颜色为红色:set(handles.figure1, 'Color', [1 0 0]);
。
(3)示例3。禁用某个控件:set(handles.edit1, 'Enable', 'off');
。
(4)常见的属性。‘String’:文本内容(如按钮、文本框);‘Value’:数值状态(如滑动条、复选框);‘Visible’:显示或隐藏控件(‘on’/‘off’);‘Position’:控件的位置和大小([x, y, width, height])。
2.2 handles.Tag
GUIDE为每个控件分配默认Tag(如pushbutton1),可在属性检查器中修改。语句 handles.Tag
作用:通过图形对象的Tag属性访问其句柄(对象的引用)。handles是一个结构体,存储了GUI中所有对象的句柄和用户自定义数据。
-
Tag 属性
(1)在GUIDE中创建控件时,需为其指定唯一的Tag(如pushbutton1)。Tag是对象的唯一标识符,用于在handles结构体中引用对象。
(2)可以直接通过handles.Tag
获取对象句柄。例如:% 获取名为 pushbutton1 的按钮句柄 button_handle = handles.pushbutton1;
。
(3)handles结构体用于在回调函数之间传递数据。用户可添加自定义字段保存数据(如handles.my_data),修改handles后需用guidata(hObject, handles)
保存更新。 -
协作关系
(1)handles.Tag
:定位GUI对象(通过Tag获取句柄)。set/get
:操作对象的属性(如显示文本、颜色、状态)。数据持久化:通过修改handles并调用guidata实现跨回调数据共享。
(2)代码示例:在按钮回调中更新文本框内容。
matlab">function pushbutton1_Callback(hObject, eventdata, handles)% 获取当前值current_value = get(handles.slider1, 'Value');% 更新文本框set(handles.edit1, 'String', num2str(current_value));% 保存数据(如需)handles.current_value = current_value;guidata(hObject, handles);
end
2.3 OpeningFcn 和 OutputFcn
- OpeningFcn(初始化函数)
(1)这是一个特定于整个 GUI 的函数,通常命名为 figName_OpeningFcn(figName 是你的 GUI 文件名)。
(2)触发时机:GUI启动时,在界面显示之前执行。
(3)用途:初始化全局变量、加载数据、设置默认参数。在CreateFcn之后执行,用于完成GUI的整体初始化。常用于传递输入参数到GUI。
(4)代码示例:
matlab">function myGUI_OpeningFcn(hObject, ~, handles, varargin)handles.data = load('default.mat'); % 加载默认数据guidata(hObject, handles); % 更新handles
end
- OutputFcn(输出函数)
(1)这是一个特定于整个 GUI 的函数,通常命名为 figName_OutputFcn(figName 是你的 GUI 文件名)。
(2)触发时机:当 GUI 关闭时调用,或者通过某些操作显式调用。
(3)用途:返回数据到MATLAB工作区。通过handles.output传递输出参数。通常与uiresume配合使用,等待用户操作完成。
(4)代码示例:
matlab">function varargout = myGUI_OutputFcn(~, ~, handles)varargout{1} = handles.output; % 返回输出参数
end
2.4 Callback
(1)定义:每个 UI 控件(如按钮、滑块等)都有一个 Callback 属性,它指定了当用户与该控件交互时(例如点击按钮),应该执行的代码。
(2)触发时机:当用户与控件进行交互时触发(如按钮点击、滑块拖动)。
(3)用途:处理控件的默认交互逻辑。
(4)示例:
matlab">function pushbutton1_Callback(hObject, ~, handles)disp('按钮被点击!'); % 按钮点击后执行的代码
end
2.5 CreateFcn 和 DeleteFcn
- CreateFcn(创建函数)
(1)触发时机:对象(如窗口、按钮)创建完成后立即触发。
(2)用途:初始化对象属性(如颜色、默认文本)。
(3)特点:每个对象的CreateFcn独立触发。使用gcbo获取当前对象句柄(因对象未完全初始化)。
(4)代码示例:
matlab">function figure1_CreateFcn(hObject, ~, ~)set(hObject, 'Color', [0.9 0.9 0.9]); % 设置窗口背景色
end
- DeleteFcn(删除函数)
(1)触发时机:对象被销毁前(如关闭窗口)。
(2)用途:执行清理操作(如保存数据、释放资源)。
(3)代码示例:
matlab">function figure1_DeleteFcn(hObject, ~, handles)save('temp_data.mat', 'handles.data'); % 保存临时数据
end
2.6 ButtonDownFcn 和 KeyPressFcn
- ButtonDownFcn(鼠标按下事件)
(1)触发时机:鼠标在对象上按下时。
(2)用途:自定义非标准点击交互(如在坐标轴上绘图)。
(3)条件:需设置PickableParts属性为’on’。
(4)代码示例:
matlab">function axes1_ButtonDownFcn(hObject, ~, handles)point = get(hObject, 'CurrentPoint');plot(point(1,1), point(1,2), 'ro'); % 在点击位置画点
end
- KeyPressFcn(按键事件)
(1)触发时机:键盘按下且对象具有焦点时。
(2)用途:处理快捷键或实时输入。
(3)特点:通常用于窗口级事件(需启用WindowKeyPressFcn)。通过get(hObject, ‘CurrentKey’)获取按键信息。
(4)代码示例
matlab">function figure1_KeyPressFcn(hObject, eventdata, handles)key = get(hObject, 'CurrentKey');if strcmp(key, 's') % 按下S键保存save_data(handles.data);end
end
- 总结
(1)Callback 是控件的主要功能入口,定义了用户交互时的行为。
(2)OpeningFcn 和 OutputFcn 是 GUI 级别的函数,分别负责初始化和返回数据。
(3)CreateFcn 和 DeleteFcn 是控件级别的函数,分别负责创建和销毁控件时的操作。
(4)ButtonDownFcn 和 KeyPressFcn 是事件处理函数,分别用于响应鼠标点击和键盘按键事件。
3. GUI 示例
要求:设计一个时间转换器,执行小时(h)—>分钟(m)—>秒(s) 的转换。下面给出实现的具体步骤:
-
启动 GUIDE,并生成 time_converter.fig 和 time_converter.m 文件
(1)在命令行窗口输入命令guide
启动 GUIDE;
(2)接着执行操作:文件(F) —> 另存为(A)—> time_converter.fig —> 保存(S),即可生成 time_converter.fig 和 time_converter.m 文件。此时的 time_converter.fig 是一个空的图形用户界面(GUI)。 -
将普通按钮、可编辑文本和静态文本组件从左侧栏拖拽到中间画板上面,如下图所示。
- 调整普通按钮、可编辑文本和静态文本这三个组件的属性
(1)我们 “双击控件” 或者 “右键单击控件” ——>选择 “属性检查器”,可以打开检查器对话框。
(2)将普通按钮组件的"FontSize"属性修改为16;“String” 属性修改为 “时间转换”,按回车(Enter键)保存修改。
(3)将可编辑文本组件的"FontSize"属性修改为12;“String” 属性修改为 “”(空),按回车(Enter键)保存修改。
(4)将静态文本组件的"FontSize"属性修改为12;“String” 属性修改为 “小时(h)”,按回车(Enter键)保存修改。
(5)我们使用 “Ctrl+C/V” 键把可编辑文本和静态文本这两个组件复制两份;并将这两个静态文本组件的"String" 属性分别修改为 “分钟(m)” 和 “秒(s)”。
(6)最终结果如下图所示:
4. 编写回调函数
右键 "时间转换"按钮 组件 → 查看回调(View Callbacks) → 选择 Callback ,通过该步骤GUIDE会自动定位到回调函数框架中。每个组件都有一个名为 “Tag” 的属性,通过代码 handles.Tag
可定位到我们要操作的组件。
(1)这三个可编辑文本的"Tag"属性值分别为:edit1、edit3、edit4,通过代码 handles.edit1
、 handles.edit3
、 handles.edit4
可定义相应的组件。
(2)我们在函数 function pushbutton1_Callback(hObject, eventdata, handles)
写入如下代码:
matlab">% 定位到Tag属性值为edit1的组件,并获取edit1组件的String属性值。也就是获取"小时(h)"的值
var = get(handles.edit1, 'String');
% 由于最初的 var 的数据类型是字符数组,因此我们需要通过str2num(var)将字符数组转为数值类型
var = str2num(var);
% 定位到Tag属性值为edit3的组件,并将edit3组件的String属性值修改为var*60。
% 即:分钟(m)=小时(h)×60
set(handles.edit3, 'String', var*60);
% 定位到Tag属性值为edit4的组件,并将edit4组件的String属性值修改为var*60*60。
% 即:秒(s)=小时(h)×60×60
set(handles.edit4, 'String', var*60*60);
- 添加清除数据按钮
我们再添加一个清除数据按钮,用来清除可编辑文本中的数据,并将该按钮的"String"属性修改为"清除数据"。
(1)右键 "清除数据"按钮 组件 → 查看回调(View Callbacks) → 选择 Callback ,通过该步骤后可定位到回调函数框架。
(2)在回调函数function pushbutton2_Callback(hObject, eventdata, handles)
中写入如下代码:
matlab">% 将edit1、edit2和edit3组件中的内容修改为空
set(handles.edit1, 'String', '');
set(handles.edit3, 'String', '');
set(handles.edit4, 'String', '');
- 最终的GUI界面如下图所示:
参考视频:
MATLAB GUI教学视频
MATLAB GUI系列(时间充裕可以看,没时间不建议看)