MATLAB GUI 全局變量的定義和使用回調函數的更改

一個例子

 

在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從句中,完成了對於其值的更改。

 

參考資料

https://www.ilovematlab.cn/thread-456538-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章