0

我是函数内的嵌套函数,我正在从基本工作区调用变量。请注意,这guiel是在基础工作区中。

function callback(~,~)
    vars.dropheight = str2num(get(edit(2),'String'));
    vars.armradius = str2num(get(edit(1),'String'));
    kiddies = get(guiel.hAX(3),'Children'); 
    delete(kiddies);
    clear kiddies;
    set(guiel.tfPanel,'Visible','off','Position',cnst.tfPanelpos);
    set(guiel.hAX(1),'Position',cnst.axpos1);
    if ishandle(guiel.hAX(2)) 
    set(guiel.hAX(2),'Position',cnst.axpos2); 
    end 
    eval(get(guiel.hPB(4),'Callback'));
end
4

2 回答 2

0

GUI 设计的最佳实践是您封装您的 GUI 及其操作,使其永远不必依赖基础工作区才能正常工作。原因?用户和其他程序可以修改基础工作区中的任何内容,因此可以轻松破坏您的 GUI。

我在这篇文章中给出了一个使用嵌套函数的基本 GUI 设置示例。这是设计 GUI 的一般框架:

function create_GUI()

  % Initialize data:
  data1 = ...;
  data2 = ...;

  % Create GUI:
  hFigure = figure;
  hObject1 = uicontrol(..., 'Callback', @callback1);
  hObject2 = uicontrol(..., 'Callback', @callback2);
  ....

  function callback1(~, ~)
    % Access any data or handles from above
    ...
  end

  function callback1(~, ~)
    % Access any data or handles from above
    ...
  end

end

这个想法是主函数创建所有的 GUI 组件,初始化所有需要的数据和对象句柄。嵌套在主函数中的回调可以根据需要访问数据和句柄。我建议像这样设计您的 GUI,或使用此处列出的其他选项之一。这应该可以缓解您的一些数据访问问题并使您的 GUI 更加健壮。

于 2017-11-15T04:55:56.690 回答
0

在我看来,最好的方法是存储guielguidata中。

guidata(hFig, guiel); % hFig can be gcf for top figure

callback通过

guiel = guidata(hFig);

一种替代方法是将变量作为输入传递给,方法是将其callback定义为

{@callback, guiel}

回调函数定义将是

function callback(~, ~, guiel)

如果你真的讨厌这些方法,一个简单的方法是将其定义为全局 inbase和你的callback. 但出于性能和代码可维护性的考虑,这是人们试图避免的事情。

于 2017-11-15T04:04:27.193 回答