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

And*_*mig 5 matlab user-interface function callback

我有这行代码:

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

并且稍微提高了这个功能:

function delete_graphic
global rr_list
selected = get(rr_list, 'Value');
selected
return;
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的帮助.

PS总是收到此错误:

??? Undefined function or variable 'delete_graphic'.
??? Error while evaluating uicontrol Callback
Run Code Online (Sandbox Code Playgroud)

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

gno*_*ice 10

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

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

  • 将按钮(第216行)的回调更改'delete_graphic'@delete_graphic.
  • delete_graphic(第185行)的函数定义更改为:

    function delete_graphic(hObject,eventdata)
    
    Run Code Online (Sandbox Code Playgroud)

    hObject发出回调的对象的句柄在哪里,是发出回调eventdata时提供的可选数据.

编辑:

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

  • 将其他输入参数添加到函数定义的末尾.例如:

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

    set(delete_btn,'Callback',{@delete_graphic,A,B});
    
    Run Code Online (Sandbox Code Playgroud)

    有一点需要注意这一点,这是价值观AB存储单元阵列按照固定在它们是什么,当你设置回调.如果更改AB在代码中,它将不会更改存储在单元格数组回调中的值.

如果您无法使用上述溶液(即如果AB需要修改的值),还有你怎么能其他几个选项共享GUI的回调之间的数据:

  • 您可以重新编写代码的组织以使用嵌套函数.这使得在回调之间共享数据变得非常容易.使用嵌套函数来创建图形用户界面的一些很好的例子可以在找到MathWorks的文件交换提交使用嵌套函数GUI例子史蒂芬主.
  • 您可以将数据存储在uicontrol对象的UserData属性中.要访问或更新它,您只需要对象句柄.
  • 您可以使用SETAPPDATA/GETAPPDATA函数将数据附加到句柄图形对象(即uicontrol).
  • 由于您的代码似乎是使用GUIDE创建的,因此您可以使用handlesGUIDE创建的结构来使用GUIDATA函数存储数据.