1. 程式人生 > >matlab-兩個gui的資料傳遞

matlab-兩個gui的資料傳遞

一、程式


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