我有这行代码:
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行)
答案 0 :(得分:10)
define a callback function通常首选的方法是使用function handle而不是字符串。使用字符串时,字符串中的代码将在基本工作区中进行评估。这意味着在评估回调时,字符串中使用的所有变量和函数都必须存在于基础工作空间中。这会导致GUI设计不佳,因为您并不希望GUI的操作依赖于基础工作区(用户可以轻松修改,因此可能会破坏您的GUI)。
这也解释了你得到的错误。函数delete_graphic
在文件rr_intervals.m
中定义为subfunction。子函数只能由同一m文件中定义的其他函数调用,因此delete_graphic
在基础工作区(评估字符串回调的位置)中不可见。使用函数句柄回调是一个更好的选择。这是你如何做到的:
'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
需要更改值),还有一些其他选项可供您share data among a GUI's callbacks:
UserData
property中。要访问或更新它,只需要对象句柄。handles
结构GUIDE创建来使用GUIDATA函数存储数据。