文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...
在博文《Matlab:學(xué)習(xí)GUI(一個簡單的例子)》(介紹的方法是完全用代碼來建立一個GUI,實(shí)際上Matlab本身有一個設(shè)計GUI的交互系統(tǒng)——GUIDE,用戶可以使用該系統(tǒng)更方便的建立自己的GUI.
本文將介紹使用GUIDE時常常遇到的幾個問題。本文將通過一個簡單的例子來說明問題,讀者朋友們可以邊看邊操作。在command line輸入guide回車,打開Layout Editor.建立一個空白的模板(Blank GUI),建立一個push button,將“String”改為“Close”,save并將文件名命名為test,如下圖:
save后,Matlab會生成兩個文件test.M和test.fig,打開test.M,如下:
functionvarargout = test(varargin)
% Begin initializationcode - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', ? ? ? mfilename,...
'gui_Singleton', ?gui_Singleton,...
'gui_OpeningFcn', @test_OpeningFcn,...
'gui_OutputFcn', ?@test_OutputFcn,...
'gui_LayoutFcn', ?[] ,...
'gui_Callback', ? []);
ifnargin && ischar(varargin{1})
gui_State.gui_Callback =str2func(varargin{1});
end
ifnargout
[varargout{1:nargout}] =gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code- DO NOT EDIT
% --- Executes justbefore test is made visible.
functiontest_OpeningFcn(hObject,eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
% --- Outputs from thisfunction are returned to the command line.
functionvarargout = test_OutputFcn(hObject,eventdata, handles)
varargout{1} = handles.output;
% --- Executes on buttonpress in pushbutton1.
functionpushbutton1_Callback(hObject,eventdata, handles)
生成的M文件的結(jié)構(gòu)主要由三個子函數(shù)構(gòu)成:_OpeningFcn,這個函數(shù)是在GUI界面出現(xiàn)以前Matlab在后臺運(yùn)行的,GUI設(shè)計者可以在這個函數(shù)內(nèi)完成數(shù)據(jù)初始化設(shè)置、GUI的界面的控制和調(diào)整等工作。_OutputFcn函數(shù)是M文件最后運(yùn)行的函數(shù),主要是為了輸出運(yùn)行結(jié)果。_Callback函數(shù)用于控制component的觸發(fā)行為,比如說用戶按下界面的按鈕后,該按鈕應(yīng)該執(zhí)行什么命令。我們這個例子設(shè)計的是按下“Close”按鈕后,GUI界面關(guān)閉,因此需要在
functionpushbutton1_Callback(hObject, eventdata, handles)
后面加上:
delete(handles.figure1);
下面我們開始借助這個簡單的例子,講一講新手在應(yīng)用GUIDE時常見的三個問題:
問題一:figure Name和figure tag弄混了。
Figure Name指的是M文件和Fig文件的name,即本例中的test. Tag指的是設(shè)計GUI界面時為每個component所指定的標(biāo)簽,也是程序中唯一的可以識別component的名字,GUI的面板也是一個component,有自己的tag,即本例中默認(rèn)的figure1.弄混figure tag和figure name的例子如下:
錯誤代碼:
functionpushbutton1_Callback(hObject, eventdata, handles)
delete(handles.test);
當(dāng)運(yùn)行錯誤代碼時,Matlab會提示找不到handles中的test變量,因?yàn)閔andles只是存儲component的句柄,每個句柄是以tag來命名的:
??? Reference to non-existentfield 'test'.
Error in ==>test>pushbutton1_Callback at 81
delete(handles.test);
問題二:uiwait在邏輯上與uiresume不配對。
還是上面的例子,如果再增加一個功能,等用戶按下“Close”按鈕后,在屏幕輸出“OK”,否則不輸出。為實(shí)現(xiàn)該功能,在test_OpeningFcn的guidata語句后增加:
% UIWAIT makes test waitfor user response (see UIRESUME)
uiwait(handles.figure1);
在test_OutputFcn的varargout{1}語句后添加:
delete(handles.figure1);
將pushbutton1_Callback中的delete(handles.figure1)刪除,并添加:
disp('OK');
uiresume(handles.figure1);
運(yùn)行后,用戶點(diǎn)擊“Close”按鈕,一切正常。可是,當(dāng)用戶不點(diǎn)擊“Close”而是直接關(guān)閉窗口時,程序提示OutputFcn輸出錯誤:
出現(xiàn)該錯誤的原因是:當(dāng)用戶直接關(guān)閉窗口時,所有在內(nèi)存中的變量都被清楚,程序在執(zhí)行到OutputFcn是已沒有變量可以賦值給結(jié)構(gòu)變量varargout{1}了。為了改正該錯誤,需要添加_CloseRequestFcn函數(shù):
% Executes when userattempts to close figure1.
functionfigure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject ? ?handle to figure1 (see GCBO)
% eventdata ?reserved - to be defined in a future versionof MATLAB
% handles ? ?structure with handles and user data (seeGUIDATA)
ifisequal(get(hObject,'waitstatus'),'waiting')
% TheGUI is still in UIWAIT, us UIRESUME
uiresume(hObject);
else
% TheGUI is no longer waiting, just close it
delete(hObject);
end
可是,如果直接將上述代碼復(fù)制到test.m文件中,保存,運(yùn)行,關(guān)閉窗口時,同樣會出現(xiàn)上述OutputFcn輸出錯誤,這個就涉及到下面第三個問題。
問題三:Layout Editor的設(shè)置和M文件不同步。
為解決上述問題,可打開figure1的Property Inspector,注意到CloseRequestFcn一欄,顯示的是closereq,點(diǎn)擊以下旁邊的圖片,變?yōu)?#xff1a;
這說明兩者已經(jīng)同步,此時可以放心的運(yùn)行程序了。
轉(zhuǎn)載本文請聯(lián)系原作者獲取授權(quán),同時請注明本文來自劉磊科學(xué)網(wǎng)博客。
收藏
分享
分享到:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《征战四方》宿敌系统全面揭秘
- 下一篇: matlab 判断鼠标按下,Matlab