【问题标题】:How to create dynamic Callbacks in MATLAB?如何在 MATLAB 中创建动态回调?
【发布时间】:2010-12-05 21:04:25
【问题描述】:

我有这行代码:

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 行)

【问题讨论】:

    标签: user-interface function matlab callback


    【解决方案1】:

    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

    【讨论】:

    • 谢谢。它有效,但我怎样才能将其他参数传递给 delete_graphic 函数?
    • @Andrew:我在回答中添加了更多细节,解释了如何将其他参数传递给函数。
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多