由於課業需要,最近需要用Matlab來寫個簡單的UI,以下是這次的記錄
1. New / APP / GUIDE
2. 點選GUIDE之後會跳出一個視窗,點選Blank GUI
按OK後會跳出以下的畫面
這時候就可以開始編輯了
3. 新增可輸入的文字方塊
拉至適當的位置,如下圖
對文字視窗快點兩下會跳出屬性視窗
String那格代表的是畫面一開起會顯示在文字輸入框裡的文字
4. 加入按鈕
在同樣的String欄位可以改變button上的文字
5. 加入靜態文字
6. 點上方的綠色開始鈕即可預覽畫面
7.為按鈕撰寫callback function
這時候的按鈕按下去都不會有任何動作產生,要為它寫callback function按鈕才會知道它在被按下時該執行什麼動作
我想做的是讓使用者輸入一個1~10000的數字,在使用者按下OK得按鈕後,讀取使用者輸入的數字並做後續的動作
先在按鈕上快點兩下開起屬性的視窗
點選Callback欄位旁的按鈕
會跳出該按鈕callback function的對應程式碼片段
以以下程式碼做範例來解釋
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
index = str2num(get(handles.edit1, 'String'));
fprintf('%d\n', index);
get(handles.edit1, 'String') 的意思是要取得edit1這個物件裡的String這個property
edit1是我們剛剛創建的那個文字方塊的tag
可以對文字方塊快點兩下從屬性視窗中看到
接著將取出的字串用str2num這個function改為int再print出來
8. 加入圖片
我想在按鈕按下後可以顯示特定圖片,因此執行以下動作:
先在視窗中拉進可以放圖片的元件
回到剛剛button的callback function
加入以下程式碼
image是想要顯示的圖檔(要自己先讀入)
axes(handles.axes1)代表我要把圖畫在tag為axes1的框框裡
imshow(image) 顯示圖片
結果如下
若不希望座標軸出現
則在gui_OpeningFcn中加入下列程式碼即可(有多少個axe就加幾個)
結果:
除此之外有什麼想要在視窗開起之前就先完成的動作也都可以寫在gui_OpeningFcn裡
[補] share variable between callback function
有時候我們會遇到好幾個callback function都需要用到同一個variable的情況
或是我想根據使用者給的index顯示好幾張圖中的其中一張 但不想要每次要顯示就要再load全部的圖一次
那就可以在gui_OpeningFcn一次先load完全部的圖
之後其他function在使用時就不必再load一次
範例如下:
在gui_OpeningFcn中加入以下的code
最後一步很重要,少了最後一行variable就無法被共享
之後我若需要用到以上的variable就可以直接使用
像是我可以直接在button的callback function中直接加入以下的code
image = reshape(handles.images(:,1), 28, 28);
其中handles.images就是gui_OpeningFcn中load的handles.images
[補] 重新開啟GUI編輯畫面
matlab關掉後重新開啟會發現無法再次開起上次GUI的編輯畫面
就算點擊.fig檔出現的也只是純圖片而無法編輯(拉新的元件等等)
要能夠繼續編輯跟創一個新的GUI的過程很像,流程如下:
1. New / APP / GUIDE
2. 跳出GUIDE Quick Start後點擊Open Existing GUI標籤
3. 選取上次的檔案後開啟
Done!
參考資料:
http://web.ntpu.edu.tw/~ccw/statmath/M_gui.pdf
https://www.mathworks.com/matlabcentral/answers/131447-how-to-show-images-in-gui-matlab
留言列表