我有这行代码:
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});
对此有一个警告,即当您设置回调。如果您在代码中更改
<A
或B
,它不会更改单元格数组回调中存储的值。
如果您不能使用上述解决方案(即,如果 A
和 B
需要更改值),还有一些其他选项可以帮助您share data among a GUI's callbacks :
- 您可以重新组织代码以利用 nested functions .这使得在回调之间共享数据变得非常容易。在 MathWorks File Exchange 中可以找到一些使用嵌套函数创建 GUI 的很好的例子。提交 GUI Examples using Nested Functions通过 Steven Lord .
- 您可以将数据存储在
UserData
property 中一个 uicontrol 对象。要访问或更新它,您只需要对象句柄。 - 您可以使用函数 SETAPPDATA/GETAPPDATA将数据附加到句柄图形对象(即 uicontrol)。
- 由于您的代码似乎是使用 GUIDE 创建的,因此您可以使用 GUIDE 创建的
handles
结构来使用 GUIDATA 存储数据功能。
关于user-interface - 如何在 MATLAB 中创建动态回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4361170/