【问题标题】:Multiple sliders in interactive octave plot交互式倍频程图中的多个滑块
【发布时间】:2021-07-27 08:59:13
【问题描述】:

我正在尝试创建一个可以使用滑块修改多个变量的 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-interface slider octave


    【解决方案1】:
    function plotstuff (h, k, event)
    

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

    function plotstuff(h, event)
    

    在此回调中,h 等于 hsliderkslideruicontrol 返回的数字)。

    您有多种选择。您可以将 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');
    

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多