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

标签 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;

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

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

感谢帮助。

附言 总是收到此错误:

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

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

最佳答案

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

这也解释了您遇到的错误。函数 delete_graphic 定义为 subfunction在您的文件 rr_intervals.m 中。子函数只能由同一 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 需要更改值),还有一些其他选项可以帮助您share data among a GUI's callbacks :

关于user-interface - 如何在 MATLAB 中创建动态回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4361170/

相关文章:

r Shiny 的条件显示

Matlab符号

java - 如何使用matlab编译器sdk编译类?

matlab - 访问矩阵的每个索引,无需索引或使用 for/while 循环

android - AnySoftKeyboard 在我隐藏它之后保留垃圾数据

android - 将不同颜色的边框添加到android View 的顶部和底部边缘的方法

ios - scrollToRowAtIndexPath 没有正确处理最后一行

javascript - 当创建一个只运行一次的函数时,重新定义应该在该函数之前还是之后进行?

javascript - 在同一对象的函数中访问变量

javascript - 这是命名约定还是函数声明