如何在MATLAB中创建动态回调?

时间:2010-12-05 21:04:26

标签: user-interface function matlab callback

我有这行代码:

delete_btn = uicontrol(rr_ops, 'Style', 'pushbutton', 'String', 'Delete Graphic', 'Position', [13 135 98 20], ...
'Callback', 'delete_graphic');

并略高一点这个功能:

function delete_graphic
global rr_list
selected = get(rr_list, 'Value');
selected
return;

为什么这段代码不起作用?我真的不明白......

我需要什么?我创建了一个按钮和一个列表框,单击按钮 - 从列表框中删除所选元素。

寻求帮助。

PS 总是收到此错误:

??? Undefined function or variable 'delete_graphic'.
??? Error while evaluating uicontrol Callback

这是我的所有代码:http://paste.ubuntu.com/540094/(第185行)

1 个答案:

答案 0 :(得分:10)

define a callback function通常首选的方法是使用function handle而不是字符串。使用字符串时,字符串中的代码将在基本工作区中进行评估。这意味着在评估回调时,字符串中使用的所有变量和函数都必须存在于基础工作空间中。这会导致GUI设计不佳,因为您并不希望GUI的操作依赖于基础工作区(用户可以轻松修改,因此可能会破坏您的GUI)。

这也解释了你得到的错误。函数delete_graphic在文件rr_intervals.m中定义为subfunction。子函数只能由同一m文件中定义的其他函数调用,因此delete_graphic在基础工作区(评估字符串回调的位置)中不可见。使用函数句柄回调是一个更好的选择。这是你如何做到的:

  • 将按钮的回调(第216行)从'delete_graphic'更改为@delete_graphic
  • delete_graphic(第185行)的功能定义更改为:

    function delete_graphic(hObject,eventdata)
    

    其中hObject是发出回调的对象的句柄,eventdata是发出回调时提供的可选数据。

修改

如果要将其他参数传递给delete_graphic,可以执行以下步骤:

  • 将附加输入参数添加到函数定义的末尾。例如:

    function delete_graphic(hObject,eventdata,argA,argB)
    
  • 在为按钮设置回调时使用单元格数组,其中第一个单元格包含函数句柄,后续单元格包含输入参数。例如:

    set(delete_btn,'Callback',{@delete_graphic,A,B});
    

    有一点需要注意,就是存储在单元格数组中的值AB 固定为设置回调时的值。如果您在代码中更改AB,则更改存储在单元格数组回调中的值。

如果您无法使用上述解决方案(例如AB需要更改值),还有一些其他选项可供您share data among a GUI's callbacks