首页 > 解决方案 > 交互式八度图中的多个滑块

问题描述

我正在尝试创建一个可以使用滑块修改多个变量的 GUI。这是我到目前为止的例子:我试图通过对两个滑块求和来改变线性函数的梯度。

我对 octave 和 matlab 的 gui 完全陌生,所以我认为存在一些基本错误。

%%%%%% In file myplot.m %%%%%
function myplot

  %% Create initial figure and spiral plot
  figure;  
  axes ('position', [0.1, 0.3, 0.8, 0.6]);
  global t;   
  t = linspace (0, 100, 101)
  x = t;
  y = t;
  plot (x, y);  
  axis ([-100, 100, -100, 100]);

  %% Add ui 'slider' element      
  hslider = uicontrol (                    ...
         'style', 'slider',                ...
         'Units', 'normalized',            ...
         'position', [0.1, 0.1, 0.8, 0.1], ...
         'min', -100,                         ...
         'max', 100,                        ...
         'value', 0,                      ...
         'callback', {@plotstuff}          ...
       );
  %% Add ui 'slider' element      
  kslider = uicontrol (                    ...
         'style', 'slider',                ...
         'Units', 'normalized',            ...
         'position', [0.1, 0, 0.8, 0.1], ...
         'min', -100,                         ...
         'max', 100,                        ...
         'value', 0,                      ...
         'callback', {@plotstuff}          ...
       );
end

%% Callback function called by slider event
%% Also in file myplot.m (i.e. a subfunction)
function plotstuff (h, k, event)
  global t;
  n = get (h, 'value');
  m = get (k, 'value');
  x = t;  
  y = (n+m) * t ;
  plot (x, y);  
  axis ([-100, 100, -100, 100]);
end

这是我的错误信息:

㎫ >> 错误:运算符 *:不一致的参数(op1 是 0x0,op2 是 1x101)错误:从 octave_test>plotstuff 在第 43 行第 5 列调用错误:运算符 *:不一致的参数(op1 是 0x0,op2 是 1x101)错误:调用来自 octave_test>plotstuff 在第 43 行第 5 列

这是图形窗口:

在此处输入图像描述

标签: user-interfaceslideroctave

解决方案


function plotstuff (h, k, event)

这个签名是错误的。回调函数的第一个参数是滑块对象的句柄。第二个论点是事件。没有第三个论点。这是正确的形式:

function plotstuff(h, event)

在此回调中,h等于hsliderkslider(返回的数字uicontrol)。

您在这里有多种选择。您可以制作hsliderkslider全局,就像您对 所做的那样t,并使用它们在回调中获取滑块值:

%% in myplot
global hslider kslider
...

%% in plotstuff
global hslider kslider
...
n = get (hslider, 'value');
m = get (kslider, 'value');

如果您不想使用全局变量,可以将两个句柄作为附加参数传递给回调:

%% in myplot
hslider = uicontrol(...)
kslider = uicontrol(...)

set(hslider, 'callback', {@plotstuff, hslider, kslider})
set(kslider, 'callback', {@plotstuff, hslider, kslider})

然后你可以使用这些参数plotstuff

function plotstuff (handle, event, hslider, kslider)
    n = get(hslider, 'value');
    m = get(kslider, 'value');

推荐阅读