【问题标题】:How to access variables from base workspace within function?如何从函数内的基本工作区访问变量?
【发布时间】:2017-11-15 12:55:56
【问题描述】:

我是一个函数内的嵌套函数,我从基础工作区调用变量。请注意,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

【问题讨论】:

    标签: matlab matlab-gui


    【解决方案1】:

    在我看来,最好的方法是将guiel 存储到guidata

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

    并通过callback 访问它

    guiel = guidata(hFig);
    

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

    {@callback, guiel}
    

    回调函数定义为

    function callback(~, ~, guiel)
    

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

    【讨论】:

      【解决方案2】:

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

      我在this post 中给出了一个使用nested functions 的基本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,或者使用列出的其他选项之一 here。这应该可以缓解您的一些数据访问问题,并使您的 GUI 更加健壮。

      【讨论】:

        猜你喜欢
        • 2017-09-27
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2021-12-30
        相关资源
        最近更新 更多