一個例子
在MATLAB GUI編程中,經常需要處理按鈕回調函數之間的一些邏輯。比如,一個處理數據的界面,需要先通過按鈕,選定數據文件、確定並導入一些數據到程序中,才能點擊下一個按鈕“查看數據”,而如果直接點擊“查看數據”,那麼程序需要提示“未導入數據”。
在這種情況下,除了可以使用判斷存放數據變量是否爲空、或者檢驗文件路徑等方法,來判斷是否確實導入了數據,也可以在按鈕回調函數上關聯全局變量——一些標記位Flag。
上面的例子中,設定“導入”標記位一開始爲0,選定完數據之後,點擊“導入數據”按鈕、且成功導入的時候,將“導入”標記位置爲1,而“查看數據”按鈕有一個對於“導入”標記位的判斷,如果爲1,才能繼續進行操作。
全局變量的定義
在MATLAB命令行輸入“guide”,點擊,新建一個空白的GUI並保存,在MATLAB 2016a版本下,該空白的界面對應的代碼應當爲74行左右。
在這個代碼中找到function Main_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從句中,完成了對於其值的更改。