Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 如何在MATLAB中创建动态回调?_User Interface_Function_Matlab_Callback - Fatal编程技术网

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

User interface 如何在MATLAB中创建动态回调?,user-interface,function,matlab,callback,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 ret

我有一行代码:

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

下面是我的全部代码:(第185行)

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

这也解释了您得到的错误。函数
delete\u graphic
在文件
rr\u interval.m
中定义为a。子函数只能由同一m文件中定义的其他函数调用,因此
delete\u graphic
在基本工作区中不可见(在该工作区中计算字符串回调)。使用函数句柄回调是更好的选择。以下是您将如何做到这一点:

  • 将按钮(第216行)的回调从
    'delete\u graphic'
    更改为
    @delete\u graphic
  • delete_graphic
    (第185行)的功能定义更改为:

    其中,
    hObject
    是发出回调的对象的句柄,
    eventdata
    是发出回调时提供的可选数据

编辑:

如果要将其他参数传递给
delete\u graphic
,可以执行以下步骤:

  • 将其他输入参数添加到函数定义的末尾。例如:

    function delete_graphic(hObject,eventdata,argA,argB)
    
    set(delete_btn,'Callback',{@delete_graphic,A,B});
    
  • 为按钮设置回调时,请使用单元格数组,其中第一个单元格包含函数句柄,随后的每个单元格都包含输入参数。例如:

    function delete_graphic(hObject,eventdata,argA,argB)
    
    set(delete_btn,'Callback',{@delete_graphic,A,B});
    
    对此有一个警告,即存储在单元格数组中的
    A
    B
    值在设置回调时是固定的。如果在代码中更改
    A
    B
    ,则不会更改存储在单元格数组回调中的值

如果您无法使用上述解决方案(即如果
A
B
需要更改值),您可以使用以下几种其他选项:

  • 您可以修改代码的组织结构以利用。这使得在回调之间共享数据非常容易。在submission by中可以找到一些使用嵌套函数创建GUI的好例子
  • 您可以将数据存储在uicontrol对象的文本中。要访问或更新它,您只需要对象句柄
  • 您可以使用函数/将数据附加到句柄图形对象(即uicontrol)
  • 由于代码似乎是使用GUIDE创建的,因此可以使用GUIDE创建的
    句柄
    结构来使用函数存储数据

谢谢。它起作用了,但我如何传递其他参数来删除图形函数?@Andrew:我在回答中添加了一些细节,解释了如何将其他参数传递给函数。