1

我正在 Matlab 中以编程方式编写我的第一个 GUI。我已经构建了 GUI 的视觉方面,现在我正在编写回调函数。当我编写回调函数时,我需要向它传递两个句柄,但由于某种原因,只有一个句柄被传递给函数。我确定这确实是一个非常基本的问题,但我真的很难克服这个问题,而且我在文档中找不到任何理由为什么这不起作用

回调是针对一个按钮并接受两个用户输入的参数,然后使用这些数字构建一个传递函数。这两个参数被输入到可编辑的文本框中,带有句柄 orderEdit 和 timeConstEdit。我可以提取我需要的字符串,然后将其转换为数字数据格式。代码如下

首先,我将回调标志设置为按钮 rtdButton

set( rtdButton, 'Callback', @rtdPlot );

回调函数的前两行如下(一旦我可以得到这些值,函数的其余部分应该可以工作):

function rtdPlot(orderEdit,timeConstEdit)
    n = str2num(get( orderEdit, 'String' ));
    tau = str2num(get( timeConstEdit, 'String' ));

但是我得到了错误

??? Error using ==> str2num at 33
Requires string or character array input.

Error in ==> mixingModel>rtdPlot at 148
         tau = str2num(get( timeConstEdit, 'String' ));

??? Error while evaluating uicontrol Callback

任何有关如何做到这一点的帮助将不胜感激

编辑:根据蜜蜂的帖子,正确的代码如下:

设置(rtdButton,'回调',{@rtdPlot,orderEdit,timeConstEdit});

    function rtdPlot(src,eventdata,arg1,arg2)
        n = str2num(get( orderEdit, 'String' ));
        tau = str2num(get( timeConstEdit, 'String' ));

干杯约翰

4

3 回答 3

2

来自 Matlab 文档:

您可以通过将回调函数添加到函数定义中来定义回调函数以接受其他输入参数:

function myCallback(src,eventdata,arg1,arg2) 为回调函数使用附加参数时,必须将属性的值设置为元胞数组(即,将函数句柄和参数括在大括号中):

图('WindowButtonDownFcn',{@myCallback,arg1,arg2})

http://www.mathworks.com/help/matlab/creating_plots/function-handle-callbacks.html

于 2013-05-22T13:55:01.717 回答
1

看看Write Code for Callbacks,尤其是Use Cell Array Callbacks部分:

如果需要为回调指定参数,可以将函数名称字符串或函数句柄和参数包装在一个元胞数组中。

  • 将回调标识为字符串以执行具有该名称的文件,例如pushbutton_callback.m.
  • 将回调标识为函数句柄,以在当前执行的代码文件中执行本地函数或嵌套函数,例如@pushbutton_callback.
于 2013-05-22T13:56:09.063 回答
1

已经提到的一种方法是将函数句柄和附加参数包含在一个元胞数组中:

set(rtdButton, 'Callback', {@rtdPlot, orderEdit, timeConstEdit})
function rtdPlot(src, eventdata, orderEdit, timeConstEdit)

或者,您可以将回调定义为嵌套函数,而无需传递单元结构,而是简单地传递@callback

function mainGui
% Create main gui graphical elements here and collect graphic handles into a structure
h.pushb(1) = ...
h.pushb(2) = ...
...

    function pb1_callback(src,event)
        % h.pushb(1) and others are visible
    end

end
于 2013-05-22T14:02:50.590 回答