2017-06-08 32 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