【问题标题】:Use a slider in MATLAB GUI在 MATLAB GUI 中使用滑块
【发布时间】:2014-12-25 07:27:43
【问题描述】:

非常简单的问题。我希望用一个简单的plot 创建GUI,用滑块改变一些东西。我一直在使用 GUI,并且在面板和 axies1 上有一个滑块+文本。所以对于初学者来说,我只想让滑块从 1:10(没有特定增量)开始并缩放 y 值(按 1:10)。我已将数据导入 GUI,因此省略了我拥有的通用自动生成代码:

Graphslide_OpeningFcn 下

handles.OutAirTemp = OutAirTemp;
handles.SupAirTemp = SupAirTemp;
guidata(hObject,handles);
handles.a = get(handles.slider2,'Value');
plot(handles.SupAirTemp,handles.a*handles.OutAirTemp)

在slider2_Callback下

a = get(hObject,'Value')

很明显我错过了一些东西!任何指针、理论或代码都将受到极大的欢迎。

Edit1 以上没有错误消息。然而,滑动滑块时它并没有改变图表。

【问题讨论】:

    标签: matlab user-interface slider matlab-figure matlab-guide


    【解决方案1】:

    你没有说你得到什么错误信息或问题是什么,所以我们无法猜测出什么问题。但是,我可以看到有几件事是错误的:

    • 您可能需要在发出plot 命令时指定要在其上绘制的轴的句柄
    • 对于你的slider2_Callback,你可能需要

      handles.a = get(hObject,'Value') guidata(hObject,handles);

    • 对于你的Graphslide_OpeningFcn,你没有说OutAirTemp 和SupAirTemp 来自哪里。我还会在函数末尾发出guidata,而不是像你正在做的那样在中间发出。

    【讨论】:

    • 没有错误信息。当我滑动滑块时,它只是没有改变图表。 OutAirTemp 和 SupAirTemp 被导入并且绘制得很好。我已将 guidata 移至函数 Graphslide_OpeningFcn 的末尾。我添加了handles.axes1,但这并没有改变。你的第一个要点是什么意思?谢谢
    • 查看plot 的文档,我的意思是plot(handles.ax,handles.SupAirTemp,handles.a*handles.OutAirTemp),其中handles.ax 是您的轴的句柄(在GUI 的其他地方获得,您首先在其中创建轴)。但是,正如@Benoit_11 所指出的,plot 调用应该在滑块回调中,而不是在 GUI 打开函数中。
    【解决方案2】:

    滑块回调是在您释放后执行的回调。在上面的代码中,您需要更新在滑块回调中绘制在轴上的值;你实际上很接近。我认为移动这些线:

    handles.a = get(handles.slider2,'Value');
    plot(handles.SupAirTemp,handles.a*handles.OutAirTemp)
    

    滑块回调内部会做你想做的事。

    顺便说一句,您可以查看以下代码来生成一个简单的 GUI,其中包含一个轴、一个滑块和一个显示滑块当前值的编辑框。 您还可以设置滑块的属性,例如最小值、最大值和步长,以获得您想要的行为。

    function GUI_slider
    clc
    clear
    
    %// Create GUI controls
    handles.figure = figure('Position',[100 100 500 500],'Units','Pixels');
    
    handles.axes1 = axes('Units','Pixels','Position',[60,100,400,300]);
    
    handles.Slider1 = uicontrol('Style','slider','Position',[60 20 400 50],'Min',0,'Max',1,'SliderStep',[.1 .1],'Callback',@SliderCallback);
    
    handles.Edit1 = uicontrol('Style','Edit','Position',[250 450 100 20],'String','Update Me');
    handles.Text1 = uicontrol('Style','Text','Position',[180 450 60 20],'String','Slider Value');
    
    handles.xrange = 1:20; %// Use to generate dummy data to plot.
    
    guidata(handles.figure,handles); %// Update the handles structure.
    
        function SliderCallback(~,~) %// This is the slider callback, executed when you release the it or press the arrows at each extremity. 
    
            handles = guidata(gcf);
    
            SliderValue = get(handles.Slider1,'Value');
            set(handles.Edit1,'String',num2str(SliderValue));
    
            plot(handles.xrange,SliderValue*rand(1,20),'Parent',handles.axes1);
        end
    
    end
    

    希望有帮助!

    【讨论】:

    • 成功了!!再次感谢你。我把原来的plot 留在了那里,这样它在启动时就有了未缩放的图形。然后它使用缩放图重新加载轴,这正是我想要的。
    • 在类似的(ish)注释中,使用 GUI 时,是否需要在 GUI 启动时使用 clc clear all close all 来清除内存?我猜不是,但我认为最好检查一下,这不值得一整个问题。
    • 哦,确实这是我在脚本开头使用 clear 和 clc 时的一种反应,哈哈,你不一定非要这样做,因为如果你使用多个 GUI 可能会造成麻烦 :)
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2016-02-11
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多