matlab-兩個gui的資料傳遞
阿新 • • 發佈:2019-02-20
一、程式
1.主程式:main.m
% 函式功能介紹: % 將 main 中的原有資料(文字框內的資料),傳送到 set_rgb_value 中,然後在 set_rgb_value 中設定 rgb % 的值後,返回 main 中,完成 rgb 值的設定。 function varargout = main(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @main_OpeningFcn, ... 'gui_OutputFcn', @main_OutputFcn, ... 'gui_LayoutFcn', [], ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function main_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; % 預載入初始資料 load('rgb_data.mat') set(handles.edit1,'string',num2str(rgb)) % Update handles structure guidata(hObject, handles); function varargout = main_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function edit1_Callback(hObject, eventdata, handles) % --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) rgb1 = str2num(get(handles.edit1,'string')); % main 程式中的資料傳入 set_rgb_value 程式;經設定之後,再傳回 main 程式 rgb = set_rgb_value(rgb1); set(handles.edit1,'string',num2str(rgb)) save('rgb_data.mat','rgb')
2.子程式:set_rgb_value.m
function varargout = set_rgb_value(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @set_rgb_value_OpeningFcn, ... 'gui_OutputFcn', @set_rgb_value_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function set_rgb_value_OpeningFcn(hObject, eventdata, handles, varargin) % rgb_pre 代表初始傳入資料;rgb 代表經修改之後的資料 global rgb_pre rgb rgb_pre = varargin{1}; set(handles.slider1,'Value',rgb_pre(1)) set(handles.slider2,'Value',rgb_pre(2)) set(handles.slider3,'Value',rgb_pre(3)) set(handles.edit1,'string',rgb_pre(1)) set(handles.edit2,'string',rgb_pre(2)) set(handles.edit3,'string',rgb_pre(3)) rgb = varargin{1}; handles.output = rgb_pre; % Update handles structure guidata(hObject, handles); % UIWAIT makes set_rgb_value wait for user response (see UIRESUME) uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = set_rgb_value_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % 當資料從 set_rgb_value 中輸出到 main 中後,將視窗關閉 delete(handles.figure1); function slider1_Callback(hObject, eventdata, handles) global rgb rgb(1) = get(hObject,'Value'); set(handles.edit1,'string',rgb(1)) function slider2_Callback(hObject, eventdata, handles) global rgb rgb(2) = get(hObject,'Value'); set(handles.edit2,'string',rgb(2)) function slider3_Callback(hObject, eventdata, handles) global rgb rgb(3) = get(hObject,'Value'); set(handles.edit3,'string',rgb(3)) function pushbutton1_Callback(hObject, eventdata, handles) global rgb handles.output = rgb; guidata(hObject, handles); uiresume(handles.figure1) function pushbutton2_Callback(hObject, eventdata, handles) global rgb_pre handles.output = rgb_pre; guidata(hObject, handles); uiresume(handles.figure1) function figure1_CloseRequestFcn(hObject, eventdata, handles) % 關閉視窗與 cancel 按鍵功能一樣,因此程式碼相同 global rgb_pre handles.output = rgb_pre; % 將資料傳送到 handles.output 中。程式在 OpeningFcn 使用 uiwait,使程式等待,當遇到 uiresume 時程式繼續執行,執行 OutputFcn ,將 set_rgb_value 中修改之後的值通過 handles.output 輸出 guidata(hObject, handles); % 當 handles 結構體中的資料發生改變時,必須使用 guidata 更新 handles 結構體 uiresume(handles.figure1) function edit1_Callback(hObject, eventdata, handles) global rgb rgb(1) = str2double(get(hObject,'string')); set(handles.slider1,'Value',rgb(1)) function edit2_Callback(hObject, eventdata, handles) global rgb rgb(2) = str2double(get(hObject,'string')); set(handles.slider2,'Value',rgb(2)) function edit3_Callback(hObject, eventdata, handles) global rgb rgb(3) = str2double(get(hObject,'string')); set(handles.slider3,'Value',rgb(3))
二、註解:
該博文中的使用uiwait(使程式在使用該語句的地方斷開,程式等待,但是程式依然可以響應事件)和uiresume(繼續執行被uiwait中斷的程式)完成兩個gui的資料傳遞。為什麼uiwait要放在OpeningFcn中以及delete(handles.figure1)放在OutputFcn中?
可以參考matlab-gui的執行流程與matlab的資料傳遞方式(後有該文連結)。這裡簡單說一下:
1.如果不使用uiwait,在main.m中呼叫set_rgb_value.m,這樣會直接執行OpeningFcn,再執行OutputFcn,在還沒有對空間進行操作時,資料已經發送回main.m中;
2.程式在執行OpeningFcn時,已經完成了gui的建立,因此uiwait放在OpeningFcn中不會出錯;
3.delete(handles.figure1)放在OutputFcn中,而CloseRequest_Fcn中沒有使用,這時因為我們要求在,傳遞完資料之後,set_rgb_value視窗關閉,而在關閉前,我們需要使用handles.output 對varargout{1}賦值完成資料的傳遞,這時如果在CloseRequest_Fcn中刪除視窗,則handles結構體在執行OutputFcn不可以獲得,造成程式出錯(當然通過這裡的分析,也可以不使用handles.output,使用全域性變數避開這個問題,這時也可以在CloseRequest_Fcn中刪除)。
三、百度雲連結:
連結:http://pan.baidu.com/s/1dFuZCZ3 密碼:vep6