一个例子
在MATLAB GUI编程中,经常需要处理按钮回调函数之间的一些逻辑。比如,一个处理数据的界面,需要先通过按钮,选定数据文件、确定并导入一些数据到程序中,才能点击下一个按钮“查看数据”,而如果直接点击“查看数据”,那么程序需要提示“未导入数据”。
在这种情况下,除了可以使用判断存放数据变量是否为空、或者检验文件路径等方法,来判断是否确实导入了数据,也可以在按钮回调函数上关联全局变量——一些标记位Flag。
上面的例子中,设定“导入”标记位一开始为0,选定完数据之后,点击“导入数据”按钮、且成功导入的时候,将“导入”标记位置为1,而“查看数据”按钮有一个对于“导入”标记位的判断,如果为1,才能继续进行操作。
全局变量的定义
在MATLAB命令行输入“guide”,点击,新建一个空白的GUI并保存,在MATLAB 2016a版本下,该空白的界面对应的代码应当为74行左右。
在这个代码中找到functionMain_OpeningFcn(hObject, eventdata, handles, varargin)这个函数,这里就是定义GUI全局变量的位置。(蓝色部分,与该GUI的命名有关,只需要记住,这个函数的名字叫OpeningFcn,即打开界面就会执行的函数)
在该函数的最后,定义全局变量,语法规则如下:
global 变量1 变量2 变量3 ...... 变量n; #使用关键字global声明,且变量中间没有逗号
变量1 = 1;
变量2 = 2;
......
变量n = n; #变量的赋值,有分号
举一个例子:
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;
% 最后这三个Flag,是全局变量
global Flag_trainimport Flag_testimport Flag_train;
Flag_trainimport=0;
Flag_testimport=0;
Flag_train=0;
这样,就实现了在进入GUI界面的时候,就已经初始化好了几个全局变量。
如果定义的全局变量,在整个GUI界面的程序执行流程中,都是有可能用到的,那么强烈建议按照这个例子,写在Opening Fcn下,不要再新建函数了,很容易出错。
使用按钮的回调函数更改全局变量
当拖动GUI组件(比如一个按钮)放到界面上并保存以后,程序中会生成对应的回调函数代码。在这些回调函数中,可以更改之前定义的GUI全局变量。
语法规则如下:
global 全局变量1 全局变量2 ...... 全局变量n; #中间没有逗号
全局变量1 = 新的数值;
......
在使用全局变量的函数中,使用到的变量必须在该函数中使用global重新定义一遍。当然,在该函数中,未使用到的全局变量可以不用定义。定义之后,使用赋值语句就可以更改它的值。
使用上面的例子,我们对于上面代码中定义的三个Flag进行修改:
% --- Executes on button press in Yes1.
function Yes1_Callback(hObject, eventdata, handles)
global Flag_trainimport;
filename1=get(handles.import_train,'String');
if(strcmp(filename1,'等待导入数据...'))
Flag_trainimport=0;
msgbox('未选择文件或无效的类型');
else
Flag_trainimport=1;
set(handles.msg,'String','成功导入训练数据');
end
我们可以看到,对于该回调函数使用到的全局变量Flag_trainimport,需要再一次声明,之后再if-else从句中,完成了对于其值的更改。
参考资料
https://www.ilovematlab.cn/thread-456538-1-1.html