【问题标题】:MATLAB GUIDE slider position and radio buttonsMATLAB GUIDE 滑块位置和单选按钮
【发布时间】:2013-09-30 17:57:12
【问题描述】:

我正在尝试编写一个脚本,该脚本利用 GUIDE 来可视化一些结果,但我偶然发现了一些问题。我将首先描述这个任务(我会尽量使它尽可能笼统,所以问题不会太长)。

我有一个绘制绘图的脚本 (main1.m),然后我选择绘图的一个区域进行分析(从现在起我将其称为 point1)并通过 GUIDE (guide_fun1.m) 生成多个绘图。函数 guide_fun1 包含 2 个单选按钮(创建为一个组)和 x 轴上的滑块,因此用户可以根据需要查看较小范围的图(图最初在 x 轴上从 0 到 1,但如果用户希望看到从 0 到 0.6 的滑块使他们能够这样做)。

我正在展示代码 main1.m(为了使其简短而没有详细说明,而是为了演示我想要实现的目标)和下面的 guide_fun1.m。如您所见,main1.m 是交互式的,用户可以连续单击绘图的几个点,直到他们键入 exit 以完成程序。对于他们单击的每个点 (point1),都会显示一个 GUIDE 窗口,其中包含图形和绘图的多个选项。

main1.m 
%---------------
filename='file1.mat'
load(filename)
figure(1)    
plot(data.x,data.y) %data from structure of the mat file

while 1%so that it continues asking for a region
figure(1)
'choose a point or press e to exit'
[x1,y1,key]=ginput(1) %point1(x1,y1) 

[data1y,data2y,datax]=function1(x1,y1) %function1 is an outside function that does    
%the analysis of the points x1,y1 that were picked from the user

guide_fun1(data1y,data2y,datax)

     if (key == 'e')
     display('End')
     break;
     else
     display('click point')
     end

end

我使用 GUIDE 创建的函数如下所示

guide_fun1.m
%-------------
function varargout = guide_fun1(varargin)

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
               'gui_Singleton',  gui_Singleton, ...
               'gui_OpeningFcn', @guide_fun1_OpeningFcn, ...
               'gui_OutputFcn',  @guide_fun1_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 guide_fun1 is made visible.
function guide_fun1_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   command line arguments to guide_fun1 (see VARARGIN)
handles.data1y = varargin{1};
handles.data2y = varargin{2};
handles.datax = varargin{3};

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

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = guide_fun1_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 when selected object is changed in uipanel1.
function uipanel1_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in uipanel1 
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)
switch get(eventdata.NewValue,'Tag') % Get Tag of selected object.

 case 'radiobutton1'
    % Code for when radiobutton1 is selected.
    semilogy(handles.datax,handles.data1y,'-r','LineWidth',4);
    axis([0 1 0. 1]);

 case 'radiobutton2'
    % Code for when radiobutton2 is selected.
    semilogy(handles.datax,handles.data2y,'-g','LineWidth',4)
    axis([0 1 0. 1]);

 end


% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
xminval=0;%set min value for x axis
xmaxval=1;%set max value for x axis
xsld_step = [0.01 0.1];%slider step

axis([xminval xmaxval 0 1]);%set axis range for plot

set(hObject,'Min',xminval);
set(hObject,'Max',xmaxval);
set(hObject, 'SliderStep', xsld_step);
new_xmaxval=get(hObject,'Value')

%this is to avoid the error in case the user slides to zero
if new_xmaxval<0.01
    'min value for x axis maximum range is 0.01'
     new_xmaxval=0.01
end


axis([xminval new_xmaxval 0 1]);%set new axis range for plot

% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

我有 3 个问题想要解决。

  1. 当滑块出现时,滑块位置为零,但由于我的初始绘图是从 0 到 1 ,我希望滑块位置为 1。有什么方法可以设置滑块初始位置?

  2. 当我将滑块位置移动到另一个值时,假设为 0.4,然后我按下下一个单选按钮(“按钮 2”),然后我的图表在 x 轴上显示为从 0 到 1 的值,但是滑块位置保持在原来的位置,在 0.4 点,所以它看起来不正确。我希望当我按下“按钮 2”时让我的滑块回到值 1 和我的图表以显示从 0 到 1 的图,或者如果我的滑块保持在之前的位置 (0.4) 让我的图表显示从 0 到 0.4 绘制,因此滑块和图形一致。我知道要做到这一点,我必须想办法将滑块与单选按钮连接起来,但我不知道该怎么做。

  3. 当我单击第一个点 (point1) 并打开 GUIDE 窗口时,没有图形,也没有按下任何按钮(这是我想要的)。然后我按下我想要的按钮并将滑块滑动到我想要检查的 x 轴范围。但是,当我单击图(1)图中要检查的另一个点(point1)时,GUIDE 窗口将保持原样,单击最后一个按钮,滑块位于上一个点的位置,并且仅当我单击“单选按钮 1' 或 '单选按钮 2' 它会更新为新点 1 的图形。我希望当我单击一个新点时,GUIDE 窗口就像第一次打开时一样,没有显示任何绘图,也没有按下任何按钮(基本上是从上一个循环重置)。

感谢您对此的任何帮助,我对 MATLAB 的了解有限,因此任何有关这方面的指导都会非常有帮助。


我能够解决您的 cmets 的一些问题,但不幸的是不是全部。

  1. 我通过在guide_fun1_OpeningFcn中添加这个命令集(handles.slider1,'value',1)解决了这个问题,每次重新启动时滑块都会变为1,所以它可以工作

  2. 我在 uipanel1_SelectionChangeFcn 里改了

    案例“单选按钮1” %选择radiobutton1时的代码。 semilogy(handles.datax,handles.data1y,'-r','LineWidth',4); 轴([0 1 0.1]);
    set(handles.slider1,'value',1);%NEW LINE

所以每次单击此按钮时,滑块都会变为值 1,因为我的轴从 0 变为 1 但它不起作用,没有错误,当我单击第一个按钮时它只是不更新​​滑块.

3 .我不知道该怎么做。我认为每次重新打开 GUI 时它都应该自动重新初始化。你能给我一个初始化子程序是什么样子的例子吗?

【问题讨论】:

  • 这有帮助吗?->set-matlab-slider-position
  • 你好卢修斯,谢谢你的帖子。我对这个链接中描述的滑块的位置并不感兴趣,但我对上面描述的值范围内的滑块位置感兴趣。
  • 不要忘记将guidata(hObject, handles); 放在每个 回调或修改handles 的方法的末尾。具体来说,uipanel1_SelectionChangeFcn.
  • 我对 uipanel1_SelectionChangeFcn 进行了更改,如下所示: case 'radiobutton1' % 选择 radiobutton1 时的代码。 semilogy(handles.datax,handles.data1y,'-r','LineWidth',4);轴([0 1 0.1]); set(handles.slider1,'value',1);%NEW guidata(hObject,handles);%NEW 我对单选按钮 2 做了同样的事情。每次按下新按钮时,滑块仍不会重置为值 1。知道我做错了什么吗?再次感谢您!
  • 嗯,set 应该移动滑块。但是现在我想起来了,guidata 调用可能没有必要,因为set 更改了句柄图形对象的属性,而不是handles 结构。不过,我不确定你的幻灯片为什么不动。检查最小/最大/步的变化?

标签: matlab slider radio-button matlab-guide


【解决方案1】:

如果您显示您的 GUI 屏幕截图会非常有帮助。

作为您的 3 个问题的起点,我会尝试以下方法:

  1. 初始滑块位置。在guide_fun1_OpeningFcn 中设置滑块值,就在guidata(hObject, handles); 之前
  2. 按下按钮更新滑块位置。在单选按钮的回调以及uipanel1_SelectionChangeFcn 中设置滑块值。不要忘记将guidata(hObject, handles); 放在每个修改句柄的回调或方法的末尾。虽然,set 不应更改 handles,而只是句柄图形对象的属性。
  3. 创建一个初始化子例程并从 guide_fun1_OpeningFcn 运行它,或者,如果您使用 GUI 而不是 ginput 处理点击,则使用轴点击/选择回调。

更一般的观察是,您不必将 GUI 放入 while 循环中,使用 ginput 来获取输入数据。您可以处理来自 GUI 代码的轴点击。

【讨论】:

  • 您好 chappjc,我已经编辑了我的帖子,以反映我在您的建议的帮助下所做的更改。我能够解决一些问题,但不是全部,因此将不胜感激。再次感谢您的帮助!
  • 你好 chappjc,set 命令现在可以工作了。之前的问题是我重命名了初始函数,但没有重命名单选按钮所在的部分,因此我在那里所做的任何更改都不会注册,因为程序将采用旧版本。现在一切正常,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多