我有这行代码:
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行)
回答:
通常,
定义回调函数的方法是使用
函数句柄而不是字符串。使用字符串时,将
在基本工作区中评估字符串中的代码。这意味着在评估回调时,字符串中使用的所有变量和函数都必须存在于基本工作空间中。这会导致GUI设计不佳,因为您实际上并不希望GUI的操作依赖于基本工作空间(用户可以轻松地对其进行修改,从而有可能破坏您的GUI)。
这也解释了您遇到的错误。函数delete_graphic在文件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}); 需要注意的是,存储在单元格数组中的值A和B 固定为设置回调时的值 。如果您在代码中更改A或B , 则不会更改存储在单元格数组回调中的值。
如果您无法使用上述解决方案(例如,如果A和B需要更改值),那么还有一些其他选项可用于
在GUI的回调之间共享数据 :
更多&回答...