2017-06-08 34 views
0

所以我指導,看起來像這樣創建GUI:傳遞從單選按鈕值到腳本在Matlab

GUI

我想從單選按鈕來訪問數據,然後改變我的模擬變量(比特率和調製是按鈕組,改進是單個單選按鈕)。例如 - 在模擬中,我有一個變量Rs=1e9,所以當選擇1Gbps按鈕時,我希望它保持1e9,但是如果選擇10Gbps按鈕,我希望它將其值更改爲10e9。

然後在點擊開始按鈕之後,我想用給定的參數開始我的仿真(在不同的.m文件中)。 我該怎麼辦?(我知道matlab中的句柄思想,但我不知道如何將值傳遞給模擬)

這是控制gui的代碼 - 由指南生成。我添加了一些開始模擬並關閉gui窗口的代碼。

function varargout = gui_final(varargin) 


% Begin initialization code - DO NOT EDIT 
gui_Singleton = 1; 
gui_State = struct('gui_Name',  mfilename, ... 
        'gui_Singleton', gui_Singleton, ... 
        'gui_OpeningFcn', @gui_final_OpeningFcn, ... 
        'gui_OutputFcn', @gui_final_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 
% End initialization code - DO NOT EDIT 


% --- Executes just before gui_final is made visible. 
function gui_final_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 unrecognized PropertyName/PropertyValue pairs from the 
%   command line (see VARARGIN) 

% Choose default command line output for gui_final 
handles.output = hObject; 

% Update handles structure 
guidata(hObject, handles); 

% UIWAIT makes gui_final wait for user response (see UIRESUME) 
% uiwait(handles.figure1); 


% --- Outputs from this function are returned to the command line. 
function varargout = gui_final_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; 


% --- Executes on button press in start. 
function start_Callback(hObject, eventdata, handles) 
% hObject handle to start (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
clc 
close all 

message = sprintf('Wait - this is a very long simulation!\nClick the OK button and wait'); 
uiwait(msgbox(message)); 
evalin('base', 'simulation'); 


% --- Executes on button press in dfe. 
function dfe_Callback(hObject, eventdata, handles) 
% hObject handle to dfe (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: get(hObject,'Value') returns toggle state of dfe 


% --- Executes on button press in ook. 
function ook_Callback(hObject, eventdata, handles) 
% hObject handle to ook (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: get(hObject,'Value') returns toggle state of ook 

回答

0

您可以使用對象「hObject」

篩選做到這一點:假設你有一個滑,每次移動滑塊回調被調用。你可以用它來存儲一個變量。然後,當你按下一個按鈕時,你想使用這些數據。該代碼是:

function slider_callback(hObject,eventdata) 
    sval = hObject.Value; 
    diffMax = hObject.Max - sval; 
    data = struct('val',sval,'diffMax',diffMax); 
    hObject.UserData = data; 
    % For R2014a and earlier: 
    % sval = get(hObject,'Value'); 
    % maxval = get(hObject,'Max'); 
    % diffMax = maxval - sval;  
    % data = struct('val',sval,'diffMax',diffMax); 
    % set(hObject,'UserData',data); 

end 

function button_callback(hObject,eventdata) 
    h = findobj('Tag','slider1'); 
    data = h.UserData; 
    % For R2014a and earlier: 
    % data = get(h,'UserData'); 
    display([data.val data.diffMax]); 
end 

參考:Matlab Docs

UPDATE

你的情況,你可以用另一種方法做,如果你想要的。當您按下按鈕START時,您將讀取單選按鈕的狀態,並將相應的值傳遞給您的simulation_function,我認爲它被稱爲「模擬」。在下面的例子中,我假設你有一個名爲(標籤)按鈕組:uibuttongroup1了,裏面有兩個按鈕:radiobutton1和radiobutton2

% --- Executes on button press in start. 
function start_Callback(hObject, eventdata, handles) 
% hObject handle to start (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

%Check which radio button is pressed 
switch get(get(handles.uibuttongroup1,'SelectedObject'),'Tag') 
    case 'radiobutton1', myParameter = 1e9; 
    case 'radiobutton2', myParameter = 10e9; 
end 
%Execute simulation 
clc 
close all 

message = sprintf('Wait - this is a very long simulation!\nClick the OK button and wait'); 
uiwait(msgbox(message)); 
evalin('base', 'simulation(myParameter)'); 
+0

很抱歉,但我還是不明白如何將這些數據傳遞給與模擬的腳本。 – dawzaw

+0

好的。我忘了寫我的腳本不是一個函數。所以我把它轉換成一個函數。但是使用你的代碼,我得到另一個錯誤:'switch get(get(handles.Bitrate,'SelectedObject'),'Tag') case'onegbps',bitrate = 1e9; case'tengbps',bitrate = 10e9; 結束 message = sprintf('等待 - 這是一個非常長的模擬!\ n單擊確定按鈕並等待'); uiwait(msgbox(message)); evalin('base','simulation(bitrate,modulation,true)');'。錯誤:'錯誤使用evalin 未定義的函數或變量 'bitrate'.' – dawzaw

+0

好吧,我糾正你的答案 - evalin(' 基地」,[ '模擬(' num2str(比特率) ')']) – dawzaw